Transactionscope.Required不适用于列表中的第一项

时间:2018-03-15 05:15:08

标签: c# transactionscope

我正在使用带有C#的SQLServer。

foreach(var item in list)
{
  TransactionOptions transOption = new TransactionOptions();
  transOption.IsolationLevel = 
    System.Transactions.IsolationLevel.ReadUncommitted;

  using (TransactionScope scope = new 
  TransactionScope(TransactionScopeOption.Required, transOption))
  {
     //Code to select
     //Code to insert

   scope.Complete();
  }
}

第一次(列表中的第1项)交易未提交。但我可以在SQL事件探查器中看到选择和插入查询。任何地方都不例外。

但是第二次(列表中的第2项)以及剩下的项目已经提交。

如果我换成TransactionScopeOption.Suppress,第一项本身就会被提交。但我不知道什么是'抑制'

TransactionScope(TransactionScopeOption.Suppress, transOption))
  {
     //Code to select
     //Code to insert

   scope.Complete();
  }

所以,为什么TransactionScopeOption.RequiredTransactionScopeOption.RequiredNew无法提交?我需要做些什么改变来提交?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

很难说为什么第1项有奇怪的行为。但是你应该知道几件事情:

交易提交

实际提交不在scope.Complete();上,而是在TransactionScope处理时发生。

TransactionScopeOptions

TransactionScopeOption.Required 保证范围内的insructions将被事务包装。它可以通过两种方式实现:a)如果存在环境外部事务,则内部范围不会创建自己的事务。如果调用outerScope.Complete()然后处理外部事务范围,则实际提交b)如果没有外部事务,则创建自己的事务。

TransactionScopeOption.RequiresNew 始终创建自己的独立交易。

TransactionScopeOption.Suppress 不会创建任何事务并忽略任何外部事务。由于没有任何事务要保存更改,因此不需要scope.Complete();,也无法回滚更改。

我希望这些信息可以帮助您了解您的具体情况。

答案 1 :(得分:0)

尝试重构代码,如下所示:

 TransactionOptions transOption = new TransactionOptions();
 transOption.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted;

 using (TransactionScope scope = new 
 TransactionScope(TransactionScopeOption.Required, transOption))
 {
      foreach(var item in enter code here`list)
      {
           //your code
           scope.Complete();
      }
 }

有关Supress的详细信息,请参阅been posted for three.js before论坛问题。