Я диагностировал проблему взаимоблокировки на моем сервере 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>