4

Верно ли, что «каждое утверждение (select/insert/delete/update) имеет уровень изоляции независимо от транзакций»?Заблокировать ли блокировки DB транзакции?

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

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

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

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

+1

Да; все операторы внутри или вне явной транзакции выполняются на некотором уровне изоляции, но какой уровень изоляции зависит от СУБД и настроек, связанных с сеансами, и т. д. –

+0

Как это работает в случае сервера sql. – Buzz

ответ

2

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

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

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

Смежные вопросы