我有以下表和索引:
--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和C在JobMaster上持有索引PK(非群集)的更新锁定,而会话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持有的pk索引上的jobmaster的U锁上等待,而B在聚集索引上持有X锁定?我的意思是因为B有X锁,这是锁定更新聚集索引,似乎没有其他锁定需求?
三个会话的锁定请求/释放顺序是什么?我的理解是,对于会话B:在JobMaster上使用PK更新锁定,使用具有集群索引的JobMaster更新锁定,然后在具有集群索引的JobMaster上进行X锁定。如果我错了,请纠正我。
由于我们不在任何查询中修改非群集索引。为什么他们需要对索引进行U锁定?为什么C在等待A,因为C已经有U锁。