允许在事务运行时进行选择

本文关键字:行选 选择 运行时 事务 | 更新日期: 2023-09-27 18:02:16

下面是在一个事务中修改表的代码。因为我知道为什么IsolationLevel Serializable读取不被阻塞,但我不能从表中选择记录。如何在不阻塞从表中选择的情况下运行事务

TransactionOptions opt = new TransactionOptions();
opt.IsolationLevel = IsolationLevel.Serializable;
using (TransactionScope scope = new TransactionScope(
    TransactionScopeOption.Required, opt))
{             
    // inserts record into table   
    myObj.MyAction();
    // trying to select the table from Management Studio                
    myObj2.MyAction();
    scope.Complete();
}

允许在事务运行时进行选择

请查看http://msdn.microsoft.com/en-us/library/ms173763.aspx了解SQL Server中隔离级别的解释。SERIALIZABLE提供最高级别的隔离,并在事务完成之前持有表的范围锁。您必须使用较低的隔离级别来允许在事务期间并发读取。

您的代码(插入,更新等)在什么隔离级别下运行并不重要-重要的是SELECT在什么隔离级别下运行。

默认情况下,这是READ COMMITTED -所以当表中有*未*提交的数据时,你的SELECT查询将无法继续。您可以使用SET TRANSACTION isolation level更改select运行时的隔离级别,以允许它READ UNCOMMITTED。或者指定一个表提示(NOLOCK)。

但是无论你做什么,它必须对正在运行select的连接/会话执行。你没有办法告诉SQL Server"请忽略其他连接所设置的设置,只要打破他们的期望"。

如果您通常希望能够在整个数据库范围内进行选择,那么您可以考虑打开READ_COMMITTED_SNAPSHOT。这是对数据库的一个全局更改—不是可以或应该为单个语句或一组语句的运行打开或关闭的东西,但它允许READ COMMITTED查询继续,而不需要锁。

Serializable是最高事务级别。它将持有最受限制的锁

您试图使用Serializable隔离级别来保护什么。

Read committed Snapshot可能更合适,但我们需要更多的信息来确定。