Как разрешить взаимоблокировку, связанную с индексом/ключом

Я диагностировал проблему взаимоблокировки на моем сервере sql, используя граф взаимоблокировки в SQL Server 2008 .

Проблема связана с моими индексами. У меня есть два запроса :длинный отчет с большим количеством объединений и подзапросов, который извлекает данные в соответствии с двумя разными датами в базовой таблице, и запрос быстрого обновления, который обновляет те же даты в этой базовой таблице. У меня есть два индекса, и в отчете требуется общая блокировка KEY для обоих из них, в то время как запрос на обновление требует эксклюзивной блокировки KEY для них обоих, и каким-то образом каждому запросу удается получить только один из ключей, поэтому ни один из них не может продолжаться.

Что я могу сделать, чтобы исправить это?

Вот все подробности моей ситуации:

Моя базовая таблица выглядит так:

CREATE TABLE job_tb{
    job_id int IDENTITY(1,1),
    createDate datetime NULL,
    upDate datetime NULL,
    dataField1 nchar(1),
    dataField2 nchar(2),
    --etc...
}

Мои индексы выглядят так:

CREATE NONCLUSTERED INDEX idx_createDate ON job_tb(
  createDate DESC
)
INCLUDE(dataField1, dataField2)

CREATE NONCLUSTERED INDEX idx_upDate ON job_tb(
  upDate DESC
)
INCLUDE(dataField1, dataField2)

Наконец, мое обновление выглядит так:

BEGIN TRANSACTION;
    UPDATE job_tb
    SET
        dataField1 = @data
        upDate = @upDate
    WHERE
        job_id = @job_id
COMMIT TRANSACTION;

И отчет подсчитывает все виды статистики по датам, поэтому я не буду включать это сюда. Я намеренно разработал idx _createDate и idx _upDate, чтобы «покрыть» или включить dataField1, так как он активно используется в этом отчете.

Я считаю, что отчет захватывает общую блокировку одного из индексов, затем попадает в подзапрос и запрашивает блокировку второго индекса. Тем временем запрос на обновление требует эксклюзивной блокировки обоих индексов, чтобы обновить как upDate, так и включенный dataField1.

Ребята, что вы думаете?

РЕДАКТИРОВАТЬ: Вот график взаимоблокировок XML, как запрошено:

  

    


    
        
            
            
            
            
        
         exec MonthlyReport @id = 41
        
    
    
        
            
            
            
            
        
         exec UpdateJob @dataField1 = 'C', @upDate = '8/3/2012 5:37:20 AM', @job_id = 1542687
        
    


    
        
            
        
        
            
        
    
    
        
            
        
        
            
        
    
  
 /deadlock-list> 

6
задан Community 13 April 2017 в 12:42
поделиться