一个Sql Server死锁问题:对更新锁的独占锁等待

时间:2014-03-15 01:28:36

标签: sql-server deadlock

遇到以下关于死锁的问题,不知道乳清会发生这种情况,需要帮助,谢谢! 这是发生的事情(简化版)。

我有以下表和索引:

    --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'    

我的问题是:

  1. 为什么会话B在由p持有的pk索引上的jobmaster的U锁上等待,而B在聚集索引上持有X锁定?我的意思是因为B有X锁,这是锁定更新聚集索引,似乎没有其他锁定需求?

  2. 三个会话的锁定请求/释放顺序是什么?我的理解是,对于会话B:在JobMaster上使用PK更新锁定,使用具有集群索引的JobMaster更新锁定,然后在具有集群索引的JobMaster上进行X锁定。如果我错了,请纠正我。

  3. 由于我们不在任何查询中修改非群集索引。为什么他们需要对索引进行U锁定?为什么C在等待A,因为C已经有U锁。

0 个答案:

没有答案