4

我正在尝试使用 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 的结果。有没有办法在事务中运行查询并将隔离级别更改为未提交的读取?

4

1 回答 1

3

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

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

请参阅本文中的汇总表,了解不同选项的行为方式。

更多关于Suppress

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

于 2013-05-24T20:52:44.450 回答