2011-09-14 23 views
5

Tôi muốn làm như sau trong một giao dịch:Newbie giao dịch sql: ngăn chặn cuộc đua ở chế độ đọc - tính -Viết

  • đọc một cột
  • nếu giá trị cột phù hợp với một điều kiện nhất định, hãy viết ra một giá trị mới cho cột

cách ly giao dịch được đặt thành cam kết đã đọc, máy chủ là máy chủ SQL.

Làm cách nào để đảm bảo rằng giao dịch khác không ghi giá trị khác vào cột sau khi tôi đọc? Máy chủ sẽ từ chối viết của tôi nếu một giao dịch khác thay đổi cột?

Nói cách khác, máy chủ SQL có thể được sử dụng như một khóa phân phối trên một cột nhất định không?

Trả lời

1

Trong trường hợp này, bạn cần sử dụng mức độ cách ly REPEATABLE READ. Với READ COMMITTED một giao dịch khác có thể thay đổi hồ sơ của bạn.
Nếu bạn có thể viết lại logic của mình trong 1 truy vấn (ví dụ: với update hoặc merge), bạn vẫn có thể sử dụng READ COMMITTED. Nhưng đôi khi nó không phải là lựa chọn. Ví dụ,

SELECT ... ; 
IF some_condition 
BEGIN 
    // execute a procedure, select from other tables, etc 
END 
ELSE 
BEGIN 
    // execute another procedure, do some other stuff 
END; 
// finally update the record 
UPDATE .... 

Cập nhật

Có một tùy chọn tôi quên đề cập đến: Sử dụng bảng gợi ý REPEATABLEREAD trong bản Tuyên Bố SELECT của bạn (See để biết chi tiết)

4

Ai nói bạn phải đọc nó trước?

UPDATE yourtable 
SET yourcolumn = CASE 
         WHEN certaincondition = 1 THEN 'newvalue' 
         ELSE yourcolumn 
        END 
WHERE id = 'yourid' 

Bạn tự đánh giá bên trong số UPDATE. Nó được đảm bảo hoàn toàn bị cô lập. Bạn có thể có nhiều người trong số này cùng một UPDATE chạy từ các trường hợp khác nhau, các giao dịch sẽ được xếp hàng đợi và xử lý từng cái một.

Các vấn đề liên quan