一个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锁。

  • 链接地址: http://www.djcxy.com/p/95445.html

    上一篇: One Sql Server Deadlock issue: exclusive lock wait on update lock

    下一篇: SQL Server deadlocks between select/update or multiple selects