在我的应用程序中,我必须执行分布式锁定模式。因为我们已经有一个 SQL Server 实例可供使用,所以我们决定在我们的 Web 应用程序的 SQL 层实现锁定是最简单的。
可以根据多种条件获得锁,包括:
- 请求的锁类型
- 任意应用程序标识符
出于所有意图和目的,将上述两个条件视为int
数据类型。
在这种模式中,我们希望将所有的锁视为 FIFO,我相信SERIALIZABLE
隔离级别会给我们。
以下是我们建议执行“锁定”的方式:
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
和“解锁”:
DELETE FROM locks WHERE LockId = @LockId
所以我的问题有两个:
- 我是否也需要进行“解锁”
SERIALIZABLE
? - 还有其他我可以使用的方法/我忘记的任何东西吗?
SQL Server 可以是 2008/2012