Уровень изоляции данных БД¶
Проблема: Используется стандартно установленный по умолчанию на MS SQL Server 2000-2008 уровнь изоляции Read commited. При этом при работе с МБД иногда, в моменты одновременного выполнения нескольких запросов с разных подключений к одной и той же таблице, могут возникать дедлоки (взаимные блокировки), приводящие к завершению запроса к БД с ошибкой. Как оказалось это следствие недостаточно аккуратно реализованной изоляции в данном типе серверов и является "встроенной проблемой". Приложение не в состоянии избежать этой проблемы.
Решение: Начиная с версии сервера 2005 следует использовать уровень изоляции Read commited snapshot, обеспечивающий нормальную работу БД при активном совместном использовании.
Для его установки необходимо выполнить специальные запросы, приведенные ниже. При выполнении запросов подключение, с которого выполняется настройка БД, должно быть единственным. Это обеспечивается специальными командами в приведенном SQL запросе. При его выполнении все остальные подключения к данной БД будут разорваны. После завершения выполнения скрипт восстанавливает нормальный режим работы БД.
Перед выполнением нужно заменить имя database_name на имя реальной БД.
USE database_name
ALTER DATABASE database_name SET SINGLE_USER WITH ROLLBACK AFTER 10
ALTER DATABASE database_name SET READ_COMMITTED_SNAPSHOT ON
ALTER DATABASE database_name SET MULTI_USER
DBCC USEROPTIONS
Последняя строка, DBCC USEROPTIONS, сообщает текущее состояние параметров работы БД, в том числе и текущий уровень изоляции. После выполнения запроса уровень должен быть read commited snapshot.
Более подробно об этом можно почитать здесь:
https://msdn.microsoft.com/en-us/library/ms188277.aspx
https://msdn.microsoft.com/en-us/library/ms173763.aspx