存储过程的回滚与C#代码的回滚

时间:2014-10-30 13:12:33

标签: c# sql-server stored-procedures transactions

我有一个程序Proc1调用另一个程序Proc2,并且都有" BEGIN TRANSCTION" 如果我在第二个过程中收到错误,它将回滚这两个过程。 OK!

但在我的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#回滚正确的事务会有问题吗?

2 个答案:

答案 0 :(得分:2)

  

" dbCommand.Transaction.Rollback();"知道我是哪个交易   在说什么?

没有。它也不关心。它回滚在连接级别上包装所有内容的事务。内部的一切都是这笔交易的一部分。

  

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

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

答案 1 :(得分:1)

在C#代码中定义Transaction时,不需要在SQL Code中添加Transaction。如果SQL代码中出现任何错误,将由C#Transaction处理,否则回滚将提交。