【发布时间】:2019-04-23 11:48:41
【问题描述】:
我需要在 SQL Server 中实现可序列化的隔离级别,但我尝试了很多方法,但都没有。
我需要在一个事务中锁定 1 行(锁定整个表并不重要)。因此,另一个事务甚至无法选择行(不要读取)。
我尝试的最后一件事:
对于交易 1:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
SELECT code FROM table1 WHERE code = 1
-- Here I select in another instance the same row
COMMIT TRAN
对于事务 2:
BEGIN TRAN
SELECT code FROM table1 WHERE code = 1
COMMIT TRAN
我希望事务 2 等到事务 1 提交操作,但事务 2 给了我行。
如果我错过了什么,谁能解释我?
【问题讨论】:
-
您的假设部分正确(下面的答案解释了原因)。将第一个查询中的选择更改为更新或插入操作并注释掉 COMMIT 部分。执行后,使用 select 运行第二个查询,它将被第一个事务阻止。然后,执行 COMMIT 部分,您将看到第二个事务很快完成
-
查找 ROWLOCK、HOLDLOCK、UPDLOCK
标签: sql sql-server transactions isolation-level