在存储过程中回滚与在C#代码中回滚

本文关键字:代码 存储过程 存储 过程中 | 更新日期: 2023-09-27 18:28:22

我有一个过程Proc1,它调用另一个过程Proc2,并且两者都带有"BEGIN TRANSCTION"如果我在第二个过程中遇到错误,它将回滚这两个过程。好啊

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

在存储过程中回滚与在C#代码中回滚

"dbCommand.Transaction.Rollback();"是否知道我是哪个事务谈论?

没有。它也不在乎。它回滚在连接级别包装所有内容的事务。里面的一切都是交易的一部分。

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

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

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