使用对象初始化构造的嵌套事务范围导致错误

Doo*_*fin 5 .net c# transactionscope object-initialization

在我的 C# 代码中,我使用嵌套的事务范围。我有一个实用程序类,它以相同的方式创建 TransactionScope 对象。外部作用域和内部作用域的构造方式完全相同。

如果我像下面的第一个示例一样构造 TransactionScope 对象,则嵌套的事务范围可以很好地协同工作:

public static TransactionScope CreateTransactionScope()
{
   var transactionOptions = new TransactionOptions();
   transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
   transactionOptions.Timeout = TransactionManager.MaximumTimeout;
   return new TransactionScope(TransactionScopeOption.Required, transactionOptions);
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我像这样构造 TransactionScope 对象,则会出现异常:

public static TransactionScope CreateTransactionScope()
{
   var transactionOptions = new TransactionOptions
   {
      IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted,
      Timeout = TransactionManager.MaximumTimeout
   };
   return new TransactionScope(TransactionScopeOption.Required, transactionOptions);
}
Run Code Online (Sandbox Code Playgroud)

错误内容为:“为 TransactionScope 指定的事务的 IsolationLevel 与为范围请求的值不同。参数名称:transactionOptions.IsolationLevel ”。

谁能向我解释为什么使用对象初始化会导致这种行为?

Eug*_*sky 1

您绝对确定只有交换上述方法才会导致异常吗?它们在功能上应该是 100% 等效的。

只需空运行这两个变体就可以了:

using (var aa1 = CreateTransactionScopeGood())
    using (var aa2 = CreateTransactionScopeGood())
        Console.WriteLine("this will be printed");

using (var aa1 = CreateTransactionScopeBad())
    using (var aa2 = CreateTransactionScopeBad())
        Console.WriteLine("this will be printed");
Run Code Online (Sandbox Code Playgroud)

能提供一下重现的方法吗?

然而,只有在同一事务中混合不同的情况时,我才能重现您的异常IsolationScope,这确实应该导致异常:

using (new TransactionScope(TransactionScopeOption.Required, new
        TransactionOptions { IsolationLevel = IsolationLevel.Chaos }))
    using (new TransactionScope(TransactionScopeOption.Required, new
            TransactionOptions { IsolationLevel = IsolationLevel.Serializable }))
        Console.WriteLine("this will not be printed");
Run Code Online (Sandbox Code Playgroud)