事务处理器内的C#,SQL SP通过超时结束事务

问题描述 投票:0回答:1

随着代码:

using (TransactionScope scope = new TransactionScope( TransactionScopeOption.RequiresNew, new System.TimeSpan( 0, 15, 0 ) ))
    {
      try
      {
        for (int i=0; i<10000; i++)
        {
          dataContext.CallSP( i );
        }
      }
      catch (Exception e)
      {
        log( e );
      }
      finally
      {
        scope.Complete();
      }
    }

如果我们呼叫CallSP,它可能会超时。如果超时,我们在尝试Complete()事务时会收到错误。

交易已中止。 | System.Data.SqlClient.SqlException(0x80131904):COMMIT TRANSACTION请求没有对应的BEGIN TRANSACTION。

有什么方法可以构建它,以便我们保持在事务中运行CallSP的加速优势,并且如果CallSP以交易不再为完成打开的方式失败,我们就不会尝试完成它?

c# stored-procedures timeout transactionscope
1个回答
0
投票

而不是在scope.Complete()子句中调用finally{},而是在try{}子句中调用它。

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew, new System.TimeSpan( 0, 15, 0 ) ))
    {
      try
      {
        for (int i=0; i<10000; i++)
        {
          dataContext.CallSP( i );
        }
        scope.Complete();
      }
      catch (Exception e)
      {
        log( e );
      }
    }

如果你输入TransactionScope条款,catch{}将自动中止,因此在退出scope.Complete()条款之前不要调用using{}

© www.soinside.com 2019 - 2024. All rights reserved.