Tôi nghĩ rằng bạn đang cố gắng giải quyết vấn đề một cách không chính xác. Những gì bạn muốn là bảo vệ tối đa tính nhất quán của cơ sở dữ liệu. Nếu hai người chạy một thủ tục được lưu trữ cùng một lúc, tính nhất quán của cơ sở dữ liệu có thể bị vi phạm.
Để bảo vệ chống lại các loại mâu thuẫn cơ sở dữ liệu khác nhau, tiêu chuẩn SQL có bốn mức cách ly giao dịch:
- ĐỌC KHÔNG HOÀN THÀNH khi các giao dịch về cơ bản mất giá trị, các giao dịch khác nhìn thấy dữ liệu bẩn. Đừng dùng cái này!
- ĐỌC CAM KẾT nơi các giao dịch chỉ nhìn thấy dữ liệu đã cam kết, nhưng có thể có sự không nhất quán khi hai giao dịch có thể bước qua các ngón chân của nhau
- ĐỌC LẠI ĐỌC nơi mà một loại không nhất quán, đọc không lặp lại, được giải quyết
- SERIALIZABLE đảm bảo rằng tồn tại một số thứ tự ảo trong đó thực hiện các giao dịch sẽ dẫn đến kết quả mà việc thực hiện của chúng dẫn đến
Tuy nhiên, tiêu chuẩn SQL có cách tiếp cận dựa trên khóa cho các sự không nhất quán của cơ sở dữ liệu này và vì lý do hiệu năng, nhiều cơ sở dữ liệu sử dụng cách tiếp cận dựa trên ảnh chụp nhanh, về cơ bản có các mức này:
- ĐỌC CAM KẾT giống như trong khóa cơ sở dữ liệu
- SNAPSHOT ISOLATION trong đó cơ sở dữ liệu nhìn thấy ảnh chụp nhanh của tất cả dữ liệu và nếu nó cố cập nhật một hàng đã được cập nhật bởi một số giao dịch khác, nó sẽ bị hủy, nhưng có một số dị thường nổi tiếng có thể xảy ra
- SERIALIZABLE giống như trong việc khóa cơ sở dữ liệu dựa trên cơ sở dữ liệu, nhưng lần này được thực hiện theo một cách khác, không phải bằng cách khóa mà bằng cách đảm bảo không có vi phạm tuần tự hóa và nếu phát hiện vi phạm đó, hãy hủy giao dịch
Việc hủy giao dịch trong các cơ sở dữ liệu dựa trên cách ly ảnh chụp này nghe có vẻ đáng lo ngại, nhưng sau đó, mọi cơ sở dữ liệu sẽ hủy giao dịch do bế tắc, do đó, bất kỳ ứng dụng hợp lý nào cũng cần có thể thử lại giao dịch.
Những gì bạn muốn là mức cô lập SERIALIZABLE : nó đảm bảo rằng nếu các giao dịch được thực hiện độc lập hết lần này đến lần khác trong trạng thái tốt, thì bất kỳ việc thực hiện song song nào của giao dịch cũng dẫn đến trạng thái tốt. May mắn thay, Michael Cahill đã có trong luận án tiến sĩ của mình để tìm ra mức độ cô lập SERIALIZABLE có thể được hỗ trợ bởi các cơ sở dữ liệu bị cô lập nhanh chóng với ít nỗ lực.
Nếu sử dụng mức cô lập SERIALIZABLE trong cơ sở dữ liệu bị cô lập nhanh, nếu hai người cố gắng chạy quy trình được lưu trữ đồng thời và họ sẽ giẫm lên các ngón chân của nhau, một trong các giao dịch sẽ bị hủy.
Bây giờ, SQL Server có thực sự hỗ trợ mức cô lập SERIALIZABLE (thay vì giả mạo cách ly ảnh chụp nhanh phía sau từ khóa SERIALIZABLE ) không? Thành thật mà nói, tôi không biết: cơ sở dữ liệu duy nhất tôi biết hỗ trợ nó là PostgreQuery.
Mặc dù tôi không thể đưa ra lời khuyên cụ thể cho SQL Server, tuy nhiên tôi vẫn đăng câu trả lời này, vì người dùng PostgreQuery và người dùng cơ sở dữ liệu khác có thể xem xét chuyển sang PostgreQuery có thể hưởng lợi từ câu trả lời của tôi. Ngoài ra, người dùng cơ sở dữ liệu không phải là PostgreQuery không thể chuyển sang PostgreQuery có thể gây áp lực cho nhà cung cấp cơ sở dữ liệu yêu thích của họ để cung cấp mức cách ly SERIALIZABLE chính hãng .