【发布时间】:2019-02-07 12:00:30
【问题描述】:
在 SSMS 的 2 个窗口中一个接一个地运行相同的脚本,延迟几秒钟。
我稍后开始的第二个实例完成,但第一个实例保持锁定,直到我关闭第二个窗口。
这里发生了什么?为什么 COMMIT 后不释放锁?
SET TRAN ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
SELECT * FROM dbo.t1
WHERE id IN (1,3)
WAITFOR DELAY '00:00:20'
UPDATE t1 SET InUse=0
WHERE id IN (1,3)
COMMIT
编辑:
表结构如下:
CREATE TABLE [dbo].[t1](
[id] [INT] NOT NULL,
[InUse] [BIT] NOT NULL DEFAULT ((0)),
PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
【问题讨论】:
-
当我在 2 个不同的会话上运行您的脚本时,我得到了预期的死锁错误。我的猜测是第二个会话已经有一个打开的事务,所以它实际上并没有提交(只是减少事务计数),阻塞第一个直到第二个被关闭并回滚。尝试将
IF @@TRANCOUNT > 0 ROLLBACK;添加到脚本的开头。 -
谢谢!我第一次遇到了 dedlock 失败,但在随后的运行中,第一个事务一直在等待。现在我可以始终如一地重现死锁。
标签: sql-server tsql transactions locks