使用BeginTransaction时外层事务回滚,内层事务是否会回滚?
问题解答
核心结论
Method2中提交的事务不会被Method1的回滚操作影响,二者属于两个完全独立的数据库事务。
原因分析
你的代码里两个关键细节决定了事务的独立性:
- 两个方法各自创建了
SqlConnection实例:Method1的con和Method2的con是完全不同的对象,对应数据库端两个独立的连接会话。 - 事务绑定到具体连接:
BeginTransaction()是基于当前SqlConnection实例创建事务,每个连接上的事务相互隔离,彼此没有关联。
具体执行逻辑的影响:
Method2执行时,自身连接开启事务、完成操作后提交,这个过程结束后,修改已经持久化到数据库,该事务的生命周期彻底结束。- 后续
Method1触发错误执行回滚,只会回滚自身连接上未提交的事务操作,和Method2已经提交的独立事务完全无关。
扩展:如何让两个方法共享事务
如果需要让Method1和Method2的操作处于同一个事务中(即Method1回滚时Method2的操作也回滚),不能重新创建连接,需要把Method1的连接或事务对象传递给Method2,示例代码如下:
public void Method1(string connectionString) { var con = new SqlConnection(connectionString); var transaction = con.BeginTransaction(); try { con.Open(); // 传递连接和事务给Method2 Method2(con, transaction); do sth that make errors bla bla...; transaction.Commit(); con.Close(); } catch { transaction.RollBack(); con.Close(); } } public void Method2(SqlConnection con, SqlTransaction transaction) { // 使用传入的连接和事务,不再创建新连接 var cmd = new SqlCommand("your sql statement", con, transaction); cmd.ExecuteNonQuery(); // 这里不再单独提交,由Method1统一控制提交/回滚 }
内容的提问来源于stack exchange,提问作者beztashe
相关产品推荐
相关产品推荐

