TransactionScope с IsolationLevel, установленным в Serializable, блокирует все SQL SELECT - PullRequest
0 голосов
/ 02 сентября 2010

Я использую транзакции PowerShell;которые создают CommittableTransaction с IsolationLevel из Serializable.Проблема в том, что когда я выполняю Транзакцию в этом контексте, все SELECT блокируются в таблицах, затронутых транзакцией, на любом соединении, кроме того, которое выполняет транзакцию.Я могу выполнить получает внутри транзакции, но не где-нибудь еще.Это включает в себя SSMS и другие исполнения командлетов.Это ожидаемое поведение?Похоже, я что-то упустил ...

PS Сценарий:

Start-Transaction
Add-Something -UseTransaction 
Get-Something #hangs here until timeout
Add-Something -UseTransaction
Undo-Transaction

Ответы [ 2 ]

6 голосов
/ 02 сентября 2010

Сериализуемые транзакции будут блокировать любые обновления в диапазонах, сканируемых под этой изоляцией.Сам по себе уровень изоляции сериализации не блокирует чтения .Если вы обнаружите, что чтение заблокировано, должно быть что-то еще, и это зависит от того, что вы делаете в этих сценариях.

2 голосов
/ 02 сентября 2010

Звучит так, как будто в вашей базе данных ALLOW_SNAPSHOT_ISOLATION = OFF.Этот параметр управляет механизмом параллелизма, используемым базой данных:

  • ALLOW_SNAPSHOT_ISOLATION = OFF: это традиционный режим SQL Server с параллелизмом на основе блокировки.Этот режим может привести к проблемам с блокировкой.

  • ALLOW_SNAPSHOT_ISOLATION = ON: Это доступно с SQL Server 2005 и использует MVCC , очень похоже на то, что делают Oracle или Postgresql,Это лучше для параллелизма, так как читатели не блокируют писателей, а писатели не блокируют читателей.

Обратите внимание, что эти два режима не ведут себя одинаково, поэтому вы должны кодировать свои транзакции дляпредполагая один или другой режим.

...