Trong ứng dụng của tôi, tôi phải thực hiện một mô hình khóa phân tán. Vì chúng tôi đã có một phiên bản SQL Server để sử dụng, chúng tôi đã quyết định rằng việc thực hiện khóa ở lớp SQL của ứng dụng web của chúng tôi là dễ dàng nhất.
Một khóa có thể được lấy dựa trên nhiều điều kiện bao gồm:
- Loại khóa được yêu cầu
- Một định danh ứng dụng tùy ý
Đối với tất cả ý định và mục đích, hãy coi hai điều kiện trên là int
kiểu dữ liệu.
Trong mô hình này, chúng tôi muốn coi tất cả các khóa của chúng tôi là FIFO, mà tôi tin rằng SERIALIZABLE
mức độ cô lập sẽ mang lại cho chúng tôi.
Đây là cách chúng tôi đề xuất để thực hiện "khóa":
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
IF EXISTS (SELECT 1 FROM locks WHERE LockType = @LockType AND ApplicationIdentifier = @ApplicationIdentifier)
BEGIN
-- Awesome, the lock will be acquired
INSERT INTO locks OUTPUT INSERTED.LockId VALUES (2,3)
END
ELSE
BEGIN
-- Someone already has the lock
SELECT -1
END
SET TRANSACTION ISOLATION LEVEL READ COMITTED
Và "mở khóa":
DELETE FROM locks WHERE LockId = @LockId
Vì vậy, câu hỏi của tôi là hai lần:
- Tôi có cần phải thực hiện "mở khóa"
SERIALIZABLE
không? - Có cách tiếp cận nào khác mà tôi có thể sử dụng / bất cứ điều gì mà tôi đã quên không?
Máy chủ SQL có thể là 2008/2012