Xếp hàng thứ tự

Một phần của tài liệu Quản lý giao tác trong CSDL quan hệ và phân tán (Trang 87)

Giả sử chúng ta có một chương trình SQL nhúng với một hàm chooeSeat( ) dùng để đọc một quan hệ về các chuyến bay (quan hệ FLIGHTS) và các chỗ sẵn có, tìm một chỗ cụ thể và làm cho nó trở thành bị chiếm. Giả thiết quan hệ FLIGHTS có các thuộc tính fltNum (số chuyến bay), fltDate (ngày bay), fltseat (chỗ) và occupied là một trường logic, có giá trị là TRUE nếu chỗ đã bị chiếm (đã được mua) và FALSE trong trường hợp còn rỗi. Khi

muốn mua một chỗ trên một chuyến bay, khách hàng cần cho biết số chuyến bay, ngày bay và số ghế. Chương trình thực hiện bằng cách trước hết kiểm tra số ghế trên chuyến bay và ngày bay mà khách hàng yêu cầu xem có rỗi không. Nếu rỗi thì làm cho nó trở thành bị chiếm (occupied = TRUE) và thông báo cho khách hàng, nếu chỗ đã bị chiếm thì cũng thông báo cho khách hàng để chọn chỗ khác.

Chương trình như sau:

1) EXEC SQL BEGIN DECLARE SECTION; 2) int flight; /* số chuyến bay*/

3) char date[10]; /*ngày bay và theo định dạng trong SQL*/ 4) char seat[3]; /*2 số và 1 ký tự mô tả một chỗ ngồi*/ 5) int occ; /* 1 biến logic để thông báo nếu chỗ ngồi xuất hiện*/

6) EXEC SQL END DECLARE SECTION; 7) void ChooseSeat() {

8) /* đoạn mã C để nhắc người dùng nhập vào số chuyến bay ngày bay, chỗ ngồi và lưu 3 giá trị này trong 3 biến*/ 9) EXEC SQL SELECT occupied INTO :occ

10) FROM Flights

11) WHERE fltNum = :flight AND fltDate = :date

AND fltSeat = :seat;

12) if (!occ) {

13) EXEC SQL UPDATE Flights

14) SET occupied = TRUE

15) WHERE fltNum = :flight

AND fltDate = :date AND fltSeat = :seat; 16) /* đoạn mã C và SQL để ghi lại chỗ ngồi

và thông tin người dùng đã chỉ định */ }

17) else /* Đoạn mã C thông báo cho người dùng là các lựa

chọn đó không còn và yêu cầu lựa chọn chỗ ngồi khác */ }

Chương trình này có thể được hai (hoặc nhiều hơn) khách hàng thực hiện một cách đồng thời. Giả sử rằng hai đại lý đang cố gắng mua cùng một chỗ

trên cùng chuyến bay và ngày bay một cách đồng thời. Cả hai đi đến dòng 9 cùng một lúc và cả hai bản sao biến cục bộ occ nhận giá trị FALSE, như vậy chỗ ngồi hiện tại đang trống. Tại dòng 12, mỗi thực hiện của chooseSeat( ) quyết định đổi occ thành TRUE và như vậy là làm cho chỗ trở thành bị chiếm. Các cập nhật này thực hiện đồng thời và mỗi thực hiện nói với khách hàng rằng (ở dòng 16) chỗ thuộc về họ. Như vậy, một chỗ được bán cho hai khách hàng!

Từ ví dụ trên ta thấy rằng hai giao tác được thực hiện đúng đắn nhưng kết quả cuối cùng là không đúng. Để làm cho việc thực hiện các giao tác đồng thời là đúng đắn, SQL có nhiều cơ cấu để phục vụ cho việc xếp hàng thứ tự sự thực hiện của hai thể hiện hàm. Một trong những cơ cấu đó là sử dụng cặp lệnh LOCK và UNLOCK. Lệnh UNLOCK được đặt ở dòng đầu của hàm, khi một giao tác thực hiện hàm, nó đối lệnh UNLOCK thành LOCK và sau khi thực hiện xong, lệnh LOCK lại được đổi thành UNLOCK. Như vậy giao tác nào thực hiện hàm trước sẽ bắt giao tác sau phải chờ đợi cho đến khi nó thực hiện hàm xong. Kỹ thuật này làm cho các giao tác được thực hiện theo thứ tự (khi cùng thực hiện các thao tác như nhau) làm tránh các sai sót trên.

Một phần của tài liệu Quản lý giao tác trong CSDL quan hệ và phân tán (Trang 87)

Tải bản đầy đủ (PDF)

(96 trang)