一个Sql Server死锁问题:独占锁等待更新锁
遇到了以下有关死锁的问题,不知道这是否发生乳清,需要帮助,谢谢! 这是发生了什么(简化版)。
我有以下表格和索引:
--Create table JobMaster
CREATE TABLE [dbo].[JobMaster](
[JobId] uniqueidentifier,
[CreateTime] datetime NOT NULL DEFAULT (GETUTCDATE()),
[JobStatus] INT NULL,
[JobStatusUpdateTime] DATETIME NULL,
[DataUploadStatus] int,
PRIMARY KEY NONCLUSTERED([JobId])
)
GO
CREATE CLUSTERED INDEX index_jobMaster_createtime ON [dbo].[JobMaster]([CreateTime])
GO
CREATE NONCLUSTERED INDEX index_jobMaster_jobStatus ON [dbo].[JobMaster]([JobStatus])
GO
CREATE NONCLUSTERED INDEX index_jobMaster_jobStatusUpdateTime ON [dbo].[JobMaster]([JobStatusUpdateTime])
GO
而且我们在三个会话中有一个死锁:死锁:A - >(等待资源持有)B - > C - > A.
A和C在带有索引PK(非群集)的JobMaster上持有更新锁,而会话B在带有群集索引的JobMaster上持有X锁
这是A / B / C操作(读提交隔离级别,无特殊设置):A / B:
UPDATE [JobMaster] SET
[DataUploadStatus] = 1,e
WHERE JobId= 'E6AEE804-6A09-4293-B93C-15E9748E46ED'
C:
UPDATE [JobMaster] SET [JobStatus] = 1,
[JobStatusUpdateTime] = GETUTCDATE()
WHERE JobId= 'E6AEE804-6A09-4293-B93C-15E9748E46ED'
我的问题是:
为什么会话B在等待p上的jobmaster的U锁上由A保持,而B在聚簇索引上持有X锁? 我的意思是因为B有X锁,这是锁更新聚集索引,似乎没有其他锁定需求?
三个会话的锁定请求/释放顺序是什么? 我的理解是,与会话B一样:使用PK和JobMaster更新JobMaster上的锁与群集索引,然后使用群集索引对JobMaster上的X锁进行更新。 纠正我,如果我错了。
由于我们不修改任何查询中的非集群索引。 为什么他们需要对索引进行锁定? 为什么C等待A,因为C已经拥有U锁。
上一篇: One Sql Server Deadlock issue: exclusive lock wait on update lock
下一篇: SQL Server deadlocks between select/update or multiple selects