在SQL Server中,如何在事务之外锁定和解锁(仅限) ?
原因:我的应用的多个实例需要与一个表进行交互而不会互相踩到脚趾,同时执行无法在事务中运行的语句
答案 0 :(得分:2)
一种选择可能是调查sp_getapplock和sp_releaseapplock。
这不会锁定表,而是一个任意命名的资源。然后,您可以将应用程序配置为仅在获取锁定后使用相关表格,例如,通过存储过程。
这方面的一个例子是:
EXEC sp_getapplock @Resource = 'ResourceName', @LockMode = 'Exclusive', @LockOwner = 'Session'
-- UPDATE table, etc.
EXEC sp_releaseapplock @Resource = 'ResourceName', @LockOwner = 'Session'
指定@LockOwner = 'Session'
表示您可以在事务之外使用此锁定机制。
还可以选择将锁定语句和释放语句解压缩到自己的存储过程中,因此逻辑只声明一次;这些存储过程可以向调用过程返回一个值,其结果指定是否已获取/释放锁。
此时,这只是确保为每个过程/表/等实施此机制的问题。哪里可能存在争议。