日期:2014-05-18  浏览次数:20469 次

SQL多表操作的回滚问题
有两个表需要更新,但是有先后顺序,
例如有表A和表B,需要先更新A,A更新成功后再更新B,但是如果B更新失败需要回滚A的操作;

现在遇到一点结构性的问题,这两个表的数据库操作函数是分开的(为了程序结构,而且也有其他地方有单独更新表A和表B的),
SQL code
using (SqlConnection conn = new SqlConnection(SqlHelper.ConnectionStringLocalTransaction))
            {
                SqlTransaction tran = null;
                try
                {
                    conn.Open();
                    tran = conn.BeginTransaction();
                    .................;//省略
                    tran.Commit();
                }
                catch (Exception ex)
                {
                    if (tran != null)
                    {
                        tran.Rollback();
                    }
                }
            }


所以数据库的连接,打开等都在各自的函数里,这样似乎就没法回滚了,难道只能单独在写一个数据库操作函数将这两个操作写在一个函数里来实现回滚吗?这样的话感觉会有很多重复的函数,维护啥的挺麻烦的,不知有没有啥好方法,求赐教!

------解决方案--------------------
SQL code

--是只要没提交,就可以回滚的。
--只要是一个事务中的语句。

------解决方案--------------------
嗯,同一个事务中就可以了,
但是TransactionScope.Complete()判断的标准是系统是否抛出异常来判断是否回滚,
楼主可以考虑自己添加判断条件来判断是否执行Complete,如果不执行该函数,则系统最后
会自动回滚前面所有的操作(前提是在using语句中)