Хочу поделиться с вами наблюдениями в тех поддержке и решением проблемы, которая стала приобретать популярность в последние время.
В частности на проектах с поддержкой СУБД MSSQL при последовательном выполнении запросов на выборку и обновление происходить взаимная блокировка с последующем возникновением deadlock.
Безусловно, что выборкам или обновлению предшествует старт транзакции.
[spoiler]
Проблемы поступает с приблизительно следующей формулировкой
Происходит спонтанное зависание корпортала, сайт не отвечает. Посмотрел в мониторе активности MS SQL - один процесс держит все остальные запросы. Этот запрос находится в файле www\bitrix\modules\main\classes\mssql\user.php, строка 527 $dbRes = $DB->Query("SELECT 'x' FROM b_user WHERE ID = ".$id." AND LAST_ACTIVITY_DATE > DATEADD(second, -".$interval.", GETDATE())";); |
После добавления данной инструкции в запрос проблема перестает наблюдаться.
Отсюда вывод, что инструкцию можно использовать в собственной логике, в собственных функциях при обращении к собственным таблицам в БД.
Данная рекомендация также описана в блоге на странице (блог не является оф. источником)
Для решения проблемы на уровне БД выполним два запроса
Select name, snapshot_isolation_state, snapshot_isolation_state_desc from sys.databases Select name, is_read_committed_snapshot_on from sys.databases |
snapshot_isolation_state = 0 is_read_committed_snapshot_on = 0 |
ALTER DATABASE AdventureWorks SET READ_COMMITTED_SNAPSHOT ON; |
ALTER DATABASE AdventureWorks SET ALLOW_SNAPSHOT_ISOLATION ON; |
Все ранее указанные рекомендации на практике помогают решить проблему.
Данный минимальный набор рекомендаций поможет Вам выполнить минимальную настройку сервера БД при возникновении deadlock
Описание проблемы в документация MSDN