Может ли SQL серверный триггер использовать более одного процесса и, возможно, заблокировать себя? Устранение тупика - PullRequest
0 голосов
/ 08 февраля 2020

У меня есть таблица TableA и другая таблица TableB. Оба имеют столбец Customerid.

В TableA есть триггер после, который содержит это (упрощенно SQL):

Delete from TableB where CustomerId = (Select CustomerId from inserted)
Insert into TableB Select * from ViewX where CustomerId = (Select CustomerId from inserted)

ViewX - это представление, которое считывает несколько объединенных таблиц, одним из них является таблица А.

Иногда я получаю взаимоблокировки, и когда я анализирую информацию о взаимоблокировках из sp_readerrorlog, я вижу, что у процесса-жертвы есть оператор Delete триггера и другой процесс с государственными операторами триггера Insert. Два процесса с двумя разными идентификаторами (показаны ниже). Может ли триггер использовать более одного процесса для своих операторов?

Когда я смотрю на список ресурсов, показанный ниже, я не уверен, означает ли это, что два его обновления для TableA для двух разных клиентов выполняются в в то же время и та же страница заблокирована? или триггер заблокирован сам. Я вижу один и тот же оператор SQL Update прямо под строкой inputbuf для каждого процесса с параметрами, но значения параметров не отображаются, поэтому я не могу понять, является ли это тот же оператор обновления или два разных обновления. Я также ищу лучший способ сделать это.

process17428c6fc28 - оператор удаления, а process29bdcd8b468 - оператор вставки.

resource-list
   keylock hobtid=72057595429978112 dbid=8 objectname=TableB indexname=idx_someindex id=lock2c954a4d880 mode=X associatedObjectId=72057595429978112
    owner-list
     owner id=process29bdcd8b468 mode=X
    waiter-list
     waiter id=process17428c6fc28 mode=U requestType=wait
   pagelock fileid=1 pageid=23599080 dbid=8 subresource=FULL objectname=TableC  id=lock2cb3a1a3900 mode=IX associatedObjectId=72057595164557312
    owner-list
     owner id=process17428c6fc28 mode=IX
    waiter-list
     waiter id=process29bdcd8b468 mode=S requestType=convert
...