Проблема известна при работе несколькими АОСами. Причина: при выполнении запроса :
SELECT A.NEXTVAL,A.ID,A.TABID,A.RECVERSION,101090 FROM SYSTEMSEQUENCES A WITH( INDEX(I_65516ID), UPDLOCK) WHERE ((DATAAREAID=@P1) AND ((ID=@P2) AND (TABID=@P3))) OPTION(FAST 1)
Накладываются на SYSTEMSEQUENCES блокировки IU (намеренение обновления, которая совместима с другой IU блокировкой) и на индекс блокировка U. Если второй АОС успевает до обновления записи SysteSequences первым аосом выполнить аналогичный селект, то тоже получает IU блокировку на таблице. При этом первый аос не может получить X блокировку (UPDATE SYSTEMSEQUENCES SET NEXTVAL=@P1, RECVERSION = CASE COALESCE(RECVERSION,1) WHEN 2147483647 THEN 1 WHEN -1 THEN 1 ELSE RECVERSION + 1 END WHERE ((DATAAREAID=@P2) AND (ID=@P3))) на таблицу, т.к. X блокировка не совместима с IU блокировкой второго АОСа. Лечится все это просто: в свойствах индекса I_65516ID отменяем постраничную блокировку и блокировку по записи. В итоге получаем при запросе nextval сразу X блокировку на таблицу SYSTEMSEQUENCES и dedlock не возникает.
Последний раз редактировалось Anarchyst; 13.09.2013 в 12:22.
|