Tôi muốn thực hiện một giao dịch nguyên tử như sau:Tôi nên sử dụng gợi ý khóa nào (T-SQL)?
BEGIN TRAN A
SELECT id
FROM Inventory
WITH (???)
WHERE material_id = 25 AND quantity > 10
/*
Process some things using the inventory record and
eventually write some updates that are dependent on the fact that
that specific inventory record had sufficient quantity (greater than 10).
*/
COMMIT TRAN A
Vấn đề là có những giao dịch khác xảy ra mà tiêu thụ số lượng từ hàng tồn kho của chúng tôi, vì vậy giữa thời điểm mà các hồ sơ được chọn và các bản cập nhật được viết trong giao dịch Một bản ghi đó có thể trở thành lựa chọn không hợp lệ vì số lượng của nó có thể đã được hạ xuống dưới ngưỡng trong mệnh đề WHERE. Vì vậy, câu hỏi là những gợi ý khóa nào tôi nên sử dụng trong mệnh đề WITH để ngăn không cho bản ghi kiểm kê đã chọn bị thay đổi trước khi tôi hoàn tất các cập nhật của mình và cam kết giao dịch?
EDIT: Vì vậy, cảm ơn John, một giải pháp tốt có vẻ là đặt mức cô lập giao dịch thành REPEATABLE READ. Điều này sẽ đảm bảo rằng "không có giao dịch nào khác có thể sửa đổi dữ liệu đã được giao dịch hiện tại đọc cho đến khi giao dịch hiện tại hoàn tất".
Tốt câu hỏi ... Tôi sẽ được làm việc trên một số mã phù hợp chính xác tiêu chí này sớm ... Tôi thậm chí đã không nhận ra đó là một vấn đề :) –
Cảm ơn Andrew! Yea nó xảy ra với tôi rằng một giao dịch không thực sự tạo ra một kết quả phù hợp nếu dữ liệu hoặc đúng hơn là các giả định giao dịch đang sử dụng được thay đổi trong khi nó đang xử lý. – Daniel