CHƯƠNG III : LẬP TRèNH
3.1.8 Bảo vệ khỏi sự cập nhật đồng thời
Giả sử rằng khi chỳng ta kiểm tra cỏc lương của cỏc nhõn viờn và sử dụng hàm HangLuong của Hỡnh 3.4, một vài tiến trỡnh khỏc đang sửa đổi quan hệ NHÂNVIấN. Chỳng ta sẽ núi nhiều hơn về nhiều tiến trỡnh truy cập đồng
nhiờn, lỳc này, đơn giản là chỳng ta chấp nhận khả năng cú những tiến trỡnh khỏc cú thể sửa đổi một quan hệ như chỳng ta sử dụng nú.
Chỳng ta phải làm gỡ về khả năng này? Hiển nhiờn là chỳng ta cú thể khụng muốn cho phộp những thay đổi cạnh tranh làm ảnh hưởng đến những bộ chỳng ta thấy thụng qua con trỏ này. Ta muốn là những thống kờ được lấy trờn quan hệ như nú tồn tại ở một thời điểm nào đú. Chỳng ta khụng thể điều khiển một cỏch chớnh xỏc những sửa đổi nào đối với quan hệ NHÂNVIấN xảy ra trước việc tập hợp cỏc thống kờ của chỳng ta, nhưng chỳng ta cú thể mong chờ rằng những cõu lệnh sửa đổi hoặc xảy ra hoàn toàn trước hoặc hoàn toàn sau khi hàm Hangluong chạy, bất chấp cú bao nhiờu nhõn viờn bị ảnh hưởng bởi một cõu lệnh sửa đổi. Để đạt được sự đảm bảo này, chỳng ta cú thể khai bỏo con trỏ ‘khụng nhạy cảm’ (insensitive) cho những thay đổi cạnh tranh.
Vớ dụ 3.6: Chỳng ta cú thể sửa đổi dũng (7) và (8) của Hỡnh.4 thành:
7) EXEC SQL DECLARE execCursor INSENSITIVE CURSOR FOR
8) SELECT Lương FROM NHÂNVIấN;
Nếu execCursor được khai bỏo như vậy, thỡ đú hệ thống SQL sẽ đảm bảo rằng những thay đổi đối với quan hệ NHÂNVIấN thực hiện giữa một mở và đúng execCursor sẽ khụng ảnh hưởng đến tập những bộ được lấy ra.
Một con trỏ insensitive cú thể đắt, theo nghĩa là hệ thống SQL cú thể sử dụng nhiều thời gian cho việc quản lý truy cập dữ liệu để đảm bảo rằng con trỏ là insensitive. Một lần nữa, một thảo luận về việc quản lý những thao tỏc đồng thời trờn cơ sở dữ liệu được hoón tới phần 3.6. Tuy nhiờn, một cỏch đơn giản để hỗ trợ một con trỏ insensitive là cho hệ thống SQL trỡ hoón lại bất kỳ tiến trỡnh nào cú thể truy cập cỏc quan hệ mà cỏc truy vấn của con trỏ insensitive của chỳng ta đang sử dụng.
Cú những con trỏ nào đú đang duyệt qua một quan hệ R mà chỳng ta cú thể núi về chỳng một cỏch chắc chắn rằng chỳng sẽ khụng thay đổi R. Một con trỏ như vậy cú thể chạy đồng thời với một con trỏ insensitive của R,
thấy. Nếu chỳng ta khai bỏo một con trỏ FOR READ ONLY, thỡ hệ cơ sở dữ liệu cú thể chắc chắn rằng quan hệ nền sẽ khụng bị sửa đổi bởi việc truy nhập tới quan hệ thụng qua con trỏ này.
Vớ dụ 3.7: Chỳng ta cú thể gắn vào sau dũng (8) của Hỡnh 3.4 một dũng FOR READ ONLY;
Nếu vậy, thỡ bất kỳ nỗ lực thực hiện một sửa đổi thụng qua con trỏ execCursor sẽ gõy ra một lỗi.