2014-10-30 61 views
1

我有一个过程Proc1调用另一个过程Proc2,并与“BEGIN TRANSCTION” 如果我在第二个过程中得到一个错误,它将回滚这两个过程。好!在存储过程回滚vs回滚在C#代码

但我的C#代码中,我也有这个

... 
    dbCommand.Transaction.Commit(); 
       dbCnn.Close(); 
      } 
      catch (Exception ex) 
      { 
       if (dbCommand.Transaction != null) 
        **dbCommand.Transaction.Rollback();** 
       if (dbCnn.State == ConnectionState.Open) 
        dbCnn.Close(); 

       throw ex; 
      } 

是否 “dbCommand.Transaction.Rollback();”知道我在谈论哪个交易?如果我有两个事务吃了同样的过程,没有标签,那么C#回滚正确的事务会是一个问题吗?

+1

没有“两次交易”这样的事情 - 您可以随心所欲地开始交易,如果您愿意,可以获得@@ TRANCOUNT为500,但是如果您执行一次ROLLBACK,它们将全部回滚。就我个人而言,我将事务控制保存在存储过程中 - 我发现很少有C#应用程序需要参与的情况。 – 2014-10-30 13:38:21

回答

2

“dbCommand.Transaction.Rollback();”知道我在谈论哪个交易 ?

不,它也不在意。它回滚连接级别上的所有事务。里面的一切都是这个交易的一部分。

如果我有两个事务吃了同样的过程,没有标签, 会是C#回滚正确事务的问题吗?

您不能有两个交易。事务形成一个层次。上面的代码回滚了整个顶级连接级别事务。您在存储过程中打开的每一个其他事务都是此事务的一部分。

+0

对不起,我现在有点困惑。问题是,我不能或者我不应该在sql server代码中放置2个事务?因为我在这里创建了一个例子,在proc里面有两个tansactions,它可以工作 – Mucida 2014-10-30 15:59:37

+1

你可以。是否有意义是你的问题(代码不关心)。许多事情都有附带的商业案例。 – TomTom 2014-10-30 16:02:03

1

由于您在C#代码中定义了事务,因此不需要在SQL代码中添加事务。如果在C#事务中处理的SQL代码中出现任何错误,那么回滚否则提交。

+0

但是在sql代码里面有一个try-catch,它会在它发生的时候发现一个错误,所以它会阻止其他的sql被执行。如果我让c#处理回滚,它是否也停止查询或它会在过程结束后回滚(当sql将结果返回给c#时) – Mucida 2014-10-30 19:16:27

+1

由于SQL代码中发生错误,它将返回到c#代码,然后在TransactionScope中基于成功或失败,您必须提交或回滚C#事务。假设,你有三个不同的SQL命令需要从c#代码顺序执行。然后用C#中的sqlconnection打开TransactionScope(),然后Fire first sql命令,假设成功执行了此sql命令,然后根据返回值(这里是真/假),然后如果成功,则触发下一个命令或回滚C#TransactionScope()。 – HaveNoDisplayName 2014-10-30 19:47:58