При начале транзакции, если SQL Server не настроен соответствующим образом , блокируются как на запись, так и на чтение все ссылки, которые задействованы от начала транзакции до её завершения, а также все записи, в которых есть ссылки на эти записи. Таким образом, чаще всего, используя функционал системы, вы так или иначе можете обратиться к этим записям на чтение. И в этом случае возникает блокировка на чтение.
1. Устанавливаем для конфигурации режим блокировок «Управляемый»;
2. Включаем для данной базы версионирование на уровне SQL.
Запрос включения режима версионирования для данной базы:
alter database [База] set READ_COMMITTED_SNAPSHOT ON with ROLLBACK IMMEDIATE
USE [master]
GO
ALTER DATABASE [База] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
ALTER DATABASE [База]
SET ALLOW_SNAPSHOT_ISOLATION ON
ALTER DATABASE [База]
SET READ_COMMITTED_SNAPSHOT ON
ALTER DATABASE [База] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO
Поле “База” нужно заменить на название вашей базы данных.
Определить включён ли режим версионирования для БД можно следующим запросом:
select name,snapshot_isolation_state_desc,is_read_committed_snapshot_on from sys.databases
И, соответственно, остаётся проблема с блокировками на запись. В данном случае эту проблему снимают увеличением таймаута ожидания при обращении к заблокированной записи.
Просмотр таймаута (просмотр настройки)
Увеличение таймаута (запись настройки)
Увеличение таймаута также снимает и проблему с блокировками на чтение, но это сказывается на быстродействии, поэтому блокировки на чтение нужно устранять именно через механизм версионирование, а увеличение таймаута ожидания настраивать только для блокировок на запись.
Также рекомендуется:
1. Установить модель восстановления базы данных в значение FULL.
2. Установить размер прироста базы данных больше 1Мб (например, 100Мб).
3. Удалить зависшие сеансы.
4. Проверить расписание фоновых заданий (установить запуск фоновых заданий в нерабочее время).