Блокировки БД требуют транзакций?

Правда ли, что "каждый оператор (выбрать / вставить / удалить / обновить) имеет уровень изоляции независимо от транзакций"?

У меня есть сценарий, в котором я установил обновление операторов внутри транзакции (ReadCommitted). И другой набор не в транзакции (выберите операторы).

  1. В этом случае, когда выполняется первый набор, другой ожидает.
  2. Если я установлю READ_COMMITTED_SNAPSHOT для БД, возникает тупик.

    ALTER DATABASE Amelio SET ALLOW_SNAPSHOT_ISOLATION ON
    ALTER DATABASE Amelio SET READ_COMMITTED_SNAPSHOT ON
    

Чтобы решить эту проблему, нужно ли поместить операторы "Выбрать" в TransactionScope?

1 ответ

Решение

В SQL Server каждая транзакция имеет неявный или явный уровень транзакции. Явный, если вызывается с BEGIN/COMMIT/ROLLBACK TRANSACTIONнеявно, если ничего подобного не выдается.

Запустите ваш снимок до начала запроса на обновление. В противном случае вы не дадите SQL Server подготовить измененные строки в базу данных tempdb, а в запросе на обновление блокировка будет по-прежнему открыта.

Другой способ без создания изоляции снимка состоит в использовании SELECT <columns> FROM <table> WITH (NOLOCK) это способ сказать SQL Server, что нужно получать строки, несмотря ни на что (иначе READ_UNCOMMITED). Так как это подсказка запроса, она меняет уровень изоляции даже с вашими настройками. Может работать, если вас не беспокоит, какое состояние строки запрашивается, однако при оценке полученных данных необходимо соблюдать осторожность.

Другие вопросы по тегам