您的代码应该可以正常工作。
假设,您正在使用 UPDLOCK/XLOCK 选择行。
第一笔交易
BEGIN TRAN
SELECT ID FROM EMPLOYEES WITH(UPDLOCK, XLOCK) WHERE CITY='ISTANBUL'
--COMMIT TRAN (Stopping commit to keep the lock running)
现在尝试在另一个窗口中运行以下操作。
第二次交易
BEGIN TRAN
SELECT ID FROM EMPLOYEES WITH(UPDLOCK, XLOCK) WHERE CITY='ISTANBUL'
COMMIT TRAN
在您提交第一笔交易之前,您的第二笔交易将无法选择。因为多个 UPDLOCK 或 XLOCK 不能同时应用于一个资源。
现在,如果您读取行而不使用未提交的第一个事务锁定,那么第二个事务将不会被第一个事务阻止。
第二次交易
BEGIN TRAN
SELECT ID FROM EMPLOYEES WHERE CITY='ISTANBUL'
COMMIT TRAN
因为在第二个事务中没有应用锁,所以它不会被第一个事务 UPDLOCK 或 XLOCK 阻止。
现在为了防止任何读取与其他读取,您需要将 ISOLATION LEVEL 更改为 SERIALIZABLE。
第一笔交易
BEGIN TRAN
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
SELECT ID FROM EMPLOYEES WHERE CITY='ISTANBUL'
--COMMIT TRAN (Stopping commit to keep the lock running)
第二次交易
BEGIN TRAN
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
SELECT ID FROM EMPLOYEES WHERE CITY='ISTANBUL'
COMMIT TRAN
现在第二笔交易将被第一笔交易阻塞。虽然在读取期间没有应用锁,但在事务隔离级别 SERIALIZABLE 中,读取事务将阻止读取同一资源上的另一个事务。
现在,如果您使用 NOLOCK 进行选择,则不存在阻止您的事务锁或隔离级别。
希望这些帮助:)