C# Transactionscope。列表中的第一项不需要工作

C# Transactionscope。列表中的第一项不需要工作,c#,transactionscope,C#,Transactionscope,我将SQLServer与C一起使用 foreach(var item in list) { TransactionOptions transOption = new TransactionOptions(); transOption.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted; using (TransactionScope scope = new TransactionSc

我将SQLServer与C一起使用

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();
  }
}
首次未提交列表事务中的第一项。但我可以在SQL分析器中看到select和insert查询。在任何地方都没有例外

但第二次是列表中的第二项,其余的项也被提交

如果我改为TransactionScopeOption.Suppress,则第一项本身将被提交。但我不知道什么是“压制”

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

   scope.Complete();
  }
那么你知道为什么TransactionScopeOption.Required和TransactionScopeOption.RequiredNew不能提交吗?要获得提交,我需要做哪些更改


提前感谢您的帮助。

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

 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();
      }
 }

有关Suppress是什么的详细信息,请参阅论坛问题。

很难说为什么第一项会有奇怪的行为。但在这里你应该知道几件事:

事务提交 实际提交不在作用域上。完成;,它发生在处理TransactionScope时

交易范围选项 TransactionScopeOption。必需保证作用域中的指令将由事务包装。它可以通过两种方式实现:a如果存在外部环境事务,那么内部范围不创建自己的事务。如果调用了outerScope.Complete,然后释放了外部事务作用域,则会发生实际提交。如果没有外部事务,则会创建自己的事务

TransactionScopeOption.RequiresNew始终创建自己的独立事务

TransactionScopeOption.Suppress不创建任何事务并忽略任何外部事务。因为没有任何事务可以保存更改,所以不需要作用域;您无法回滚更改


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

是的,我可以照您所说的做,但我希望提交每个项目,而不是等待完成整个列表。因为列表包含50多条记录。@KathirVey请查看我的编辑。我将scope.Complete放入循环中,以逐个提交每个插入。尝试过,但这也会给出一个错误。错误类似于第二个item.outerScope.Complete的事务预期行:2,但实际行:1-我认为我们有外部NHibernate会话。TransactionScopeOption.Required-完成整个列表后是否提交?表示foreach的结束。基本上,外部TransactionScope不是外部NHibernate会话。TransactionScopeOption.Required应在每次迭代中创建一个新事务。由于您的代码示例不完整,我无法回答您的问题。我认为你能自己回答你的问题。只需在调试中尝试。