Hãy nói rằng tôi có một thủ tục lưu trữ đơn giản mà trông như thế này (lưu ý: đây chỉ là một ví dụ, không phải là một thủ tục thực tế):Thủ tục lưu trữ T-SQL có thực thi 'nguyên tử' không?
CREATE PROCEDURE incrementCounter AS
DECLARE @current int
SET @current = (select CounterColumn from MyTable) + 1
UPDATE
MyTable
SET
CounterColumn = current
GO
Chúng tôi giả sử tôi có một bảng gọi là 'myTable' có chứa một hàng, với 'CounterColumn' chứa số đếm hiện tại của chúng tôi.
Quy trình được lưu trữ này có thể được thực hiện nhiều lần, cùng một lúc không?
tức là điều này có thể:
Tôi gọi 'incrementCounter' hai lần. Gọi A đến điểm mà nó đặt biến 'hiện tại' (giả sử nó là 5). Gọi B đến điểm mà nó đặt biến 'hiện tại' (cũng sẽ là 5). Gọi A kết thúc thực hiện, sau đó gọi B kết thúc. Cuối cùng, bảng phải chứa giá trị là 6, nhưng thay vì chứa 5 do chồng chéo thực thi
Hiện tượng này được gọi là "mất cập nhật". Đó là "cô lập" không phải là nguyên tử mà bạn cần phải nhìn vào. Theo mặc định đọc mức cô lập cam kết nó ** là ** có thể trái với hàm ý trong câu trả lời được chấp nhận. –
Một câu trả lời thực tế cho điều này trong SQL Server 2005 là: Sử dụng một bảng có cột 'IDENTITY', Chèn vào bảng rồi đọc lại giá trị mới bằng' SCOPE_IDENTITY'. Sau đó, bạn không bao giờ có một vụ va chạm. –