在事务运行时允许选择

时间:2011-07-14 06:12:58

标签: c# .net sql-server

以下是从一个transatcion修改表的代码。我知道为什么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();
}

3 个答案:

答案 0 :(得分:1)

有关SQL Server中隔离级别的说明,请查看http://msdn.microsoft.com/en-us/library/ms173763.aspx。 SERIALIZABLE提供最高级别的隔离并对表进行范围锁定,直到事务完成为止。您必须使用较低的隔离级别来允许在事务期间进行并发读取。

答案 1 :(得分:1)

您的(插入,更新等)代码运行的隔离级别无关紧要 - SELECT正在运行的隔离级别很重要。

默认情况下,这是READ COMMITTED - 因此当表中有* un * commit数据时,SELECT查询无法继续。您可以使用SET TRANSACTION ISOLATION LEVEL更改选择运行的隔离级别,以使其无法读取。或者指定table hint(NOLOCK)。

但无论你做什么,都必须对运行select的连接/会话进行操作。你无法告诉SQL Server“请忽略其他连接设置的设置,只是打破他们的期望”。

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

答案 2 :(得分:0)

Serializable是最高的交易级别。它将拥有最受限制的锁。

您希望使用Serializable的隔离级别保护什么。

阅读Commited Snapshot可能更合适,但我们需要更多信息才能确定。