При использовании Sql Server 2016
:
Проблема:
Когда мы пишем Select
оператор shared locks
хранится на ресурсах, скажем, TableX, из которого выбираются максимальные, минимальные и текущие значения. Теперь на данный момент, если вы Insert
данных в этих заблокированных таблицах (TableX), то, поскольку Insert
требует блокировки Exclusive
для ресурса (TableX), оператор Insert
будет ожидать получения Select
завершено.
Решение:
Как предлагается в постах ниже, мы можем использовать with (nolock) or with (read uncommitted)
табличные подсказки, чтобы операторы Select
не блокировали базовые ресурсы (TableX). Но проблема в том, что Select
может считывать незафиксированные данные, которые были изменены во время транзакции, а затем впоследствии были возвращены в исходное состояние (также называемое чтением грязных данных).
Если вы хотите убедиться, что Select
читает зафиксированные данные, а также не блокировать Inserts
для записи в TableX, то на уровне базы данных SET READ_COMMITTED_SNAPSHOT ON
.