将IsolationLevel设置为Serializable的TransactionScope锁定所有SQL SELECT

时间:2010-09-02 15:26:36

标签: c# sql-server powershell transactions transactionscope

我正在使用PowerShell交易;这将创建一个具有Seri​​alizable的IsolationLevel的CommittableTransaction。问题是,当我在此上下文中执行事务时,除了执行事务的连接之外的任何连接上,除了事务影响的表之外,所有SELECT都被阻塞。我可以在交易中执行获取,但不能在其他任何地方执行。这包括SSMS和其他cmdlet执行。这是预期的行为吗?好像我错过了什么......

PS脚本:

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

2 个答案:

答案 0 :(得分:6)

可序列化事务将阻止在此隔离下扫描的范围上的任何更新。序列化隔离级别本身不会阻止读取。如果您发现读取被阻止,则必须使用其他内容,这取决于您在这些脚本中执行的操作。

答案 1 :(得分:2)

听起来好像您的数据库有ALLOW_SNAPSHOT_ISOLATION = OFF。此设置控制数据库使用的并发机制:

  • ALLOW_SNAPSHOT_ISOLATION = OFF:这是SQL Server的传统模式,具有基于锁的并发性。此模式可能会导致锁定问题。

  • ALLOW_SNAPSHOT_ISOLATION = ON:自SQL Server 2005以来,这是可用的,使用MVCC,非常类似于Oracle或Postgresql所做的。这对于并发性更好,因为读者不会阻止编写者,编写者也不会阻止读者。

请注意,这两种模式的行为方式不同,因此您必须将事务编码为假设一种模式或另一种模式。