Блокировки БД требуют транзакций? - PullRequest
4 голосов
/ 05 февраля 2010

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

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

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

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

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

1 Ответ

2 голосов
/ 05 февраля 2010

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

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

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

...