За последние несколько лет мы заметили увеличение числа взаимоблокировок и длительных транзакций в нашей базе данных SQL Server (2008r2). В настоящее время мы запускаем нашу базу данных со следующими настройками ALLOW_SNAPSHOT_ISOLATION OFF
и READ_COMMITTED_SNAPSHOT OFF
. Блокировки тупиков управляются из кода с использованием процесса повторных попыток / ожидания.
Наш код приложения (c #) создает SqlConnection
, используя конструктор по умолчанию (из декомпиляции представляется IsolationLevel.Unspecified
), который, я считаю, позволяет SQL делать свое дело, что в нашем случае будет таким же, как READ COMMITTED
(Я думаю).
Мы собираемся представить снимки, установив ALLOW_SNAPSHOT_ISOLATION ON
и READ_COMMITTED_SNAPSHOT ON
и переопределив конструктор c # с помощью RepeatableRead
. Я считаю, что эта комбинация настроек позволит нашему коду функционировать так же, как и сейчас. Это позволит нам постепенно оценить нашу кодовую базу, чтобы убедиться, что изменение уровня изоляции и моментальных снимков не оказывает негативного влияния на то, как мы воспринимаем процедуры SQL в настоящее время. Нам, конечно, нужно добавить SET TRANSACTION ISOLATION LEVEL SNAPSHOT
в начало любой процедуры, для которой мы хотим использовать моментальный снимок (чтобы переопределить настройку c # IsolationLevel.RepeatableRead
).
Причина такой обработки заключается в том, что две настройки базы данных по сути вынуждают нас переводить нашу базу данных в автономный режим, что требует окна обслуживания, и мы хотели бы подготовиться к постепенным изменениям, но хотели бы, чтобы код продолжал выполнять то же самое как это сразу же после изменений.
Я просто ищу подтверждение того, что мое понимание верно. Если я не прав, что мне нужно сделать после внесения изменений в базу данных, чтобы имитировать нашу текущую рабочую среду?