SQL死锁删除然后批量插入
我有一个SQL Server中的死锁问题,我无法解决。
基本上,我有大量的并发连接(来自许多机器)执行事务,首先删除一系列条目,然后用批量插入重新插入相同范围内的条目。
本质上,交易看起来像这样
BEGIN TRANSACTION T1
DELETE FROM [TableName] WITH( XLOCK HOLDLOCK ) WHERE [Id]=@Id AND [SubId]=@SubId
INSERT BULK [TableName] (
[Id] Int
, [SubId] Int
, [Text] VarChar(max) COLLATE SQL_Latin1_General_CP1_CI_AS
) WITH(CHECK_CONSTRAINTS, FIRE_TRIGGERS)
COMMIT TRANSACTION T1
批量插入仅在同一事务中插入与删除的Id和SubId匹配的项目。 此外,这些Id和SubId条目不应该重叠。
当我有足够的这种形式的并发事务时,我开始在这些语句之间看到大量的死锁。
我添加了锁定提示XLOCK HOLDLOCK来尝试处理这个问题,但他们似乎没有帮助。
此错误的规范死锁图显示:
连接1:
连接2:
我需要做些什么才能确保这些僵局不会发生。
我一直在阅读RangeX-X锁,我不确定我完全理解这些。 我有没有任何选项可以锁定整个表格?
继萨姆萨夫龙的回答之后:
它很难给你一个准确的答案,没有索引/表大小列表等,但请记住,SQL不能在同一个实例中获取多个锁。 它会一次抓取一个锁,并且如果另一个连接已经拥有该锁并且它对第一个事务需要的某个锁具有锁定,那么kaboom会导致死锁。
在这个特定的例子中,你可以做几件事情:
上一篇: SQL deadlock on delete then bulk insert
下一篇: SQLServer deadlock