在.net中使用TransactionScopeOption.Suppress时,为什么忽略隔离级别

时间:2013-05-24 20:42:31

标签: .net sql-server transactionscope isolation-level

我正在尝试使用LINQ TO SQL在现有事务中使用未提交的隔离级别读取执行查询。如果我使用该选项来禁止父事务中的此事务,我似乎失去了指定隔离级别的能力。在LINQPad中使用此代码:

void Main()
{
var db = this;
db.ExecuteQuery<string>(@"SET TRANSACTION ISOLATION LEVEL SERIALIZABLE");

using (var trans = new TransactionScope(TransactionScopeOption.Required))
{
    // updates or inserts here

    using (new TransactionScope(TransactionScopeOption.Suppress,
        new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted }))
    {
        db.ExecuteQuery<string>(@"SELECT CASE transaction_isolation_level 
        WHEN 0 THEN 'Unspecified' 
        WHEN 1 THEN 'ReadUncomitted' 
        WHEN 2 THEN 'Readcomitted' 
        WHEN 3 THEN 'Repeatable' 
        WHEN 4 THEN 'Serializable' 
        WHEN 5 THEN 'Snapshot' END AS TRANSACTION_ISOLATION_LEVEL 
        FROM sys.dm_exec_sessions 
        where session_id = @@SPID
        ").Dump("Inside the transaction");

    }
    // updates or inserts here
}
}

我得到了SERIALIZABLE的结果。有没有办法在事务中运行查询并将隔离级别更改为read uncommitted?

1 个答案:

答案 0 :(得分:3)

您要使用的是TransactionScopeOption.RequiresNewSupress选项会使封闭块在没有环境事务的情况下运行,也不会创建新的封闭块。这就是它的作用。

RequiresNew会导致创建新的根事务范围。

请参阅this article中的摘要表,了解不同选项的行为方式。

有关Suppress的更多信息:

  当您想要保留执行的操作时,

抑制非常有用   由代码部分,并不想中止环境事务   如果操作失败。例如,当您要执行日志记录时   或审核操作,或者您希望向订阅者发布事件时   无论您的环境事务是提交还是中止。