【发布时间】:2010-03-22 21:45:27
【问题描述】:
我遇到了无法解决的 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:
- 在 PK_TableName 上保持 RangeX-X
- 在表上持有 IX 页锁
- 在表上请求 X 页锁定
连接 2:
- 在表上持有 IX 页锁定
- 在桌子上请求 RangeX-X 锁定
我需要做些什么来确保不会发生这些死锁。
我一直在阅读有关 RangeX-X 锁的一些信息,但我不确定我是否完全理解这些锁的情况。除了在此处锁定整个表格之外,我还有其他选择吗?
【问题讨论】:
标签: sql-server tsql deadlock