SqlConnection con = new SqlConnection(CommonERP.sqlConStr);
            //连接
            con.Open();
            //实例化事务
            SqlTransaction myst = con.BeginTransaction();
            try
            {
                //保存主表数据
                int mainResult = DAL.po_purchaseOrder.addPurchaseOrder(myst, obj);
                if (mainResult <= 0)
                {
                    myst.Rollback();
                    con.Close();
                }
                //循环保存子表数据
                for (int i = 0; i < rowAdd.Length; i++)
                {
                    //项次加1
                    string no = "0" + (maxNo += 1).ToString();
                    //构造正确项次
                    no = no.Substring(no.Length - 2);
                    //项次赋值
                    rowAdd[i]["poOrderItemNo"] = no;
                    int itemResult = DAL.po_purchaseOrder.addItem(myst, rowAdd[i], obj.PoOrderNo);
                    if (itemResult <= 0)
                    {
                        myst.Rollback();
                        con.Close();
                        return false;
                    }
                }
                //提交事务
                myst.Commit();
                //关闭连接
                con.Close();
                //返回值
                return true;
            }
            catch
            {
                myst.Rollback();
                con.Close();
                return false;
            }
我这样写事务,如果子表出错,会回滚主表的操作吗?

解决方案 »

  1.   

    int itemResult = DAL.po_purchaseOrder.addItem(myst, rowAdd[i], obj.PoOrderNo); 
    这个应该是提交子表的数据吧?这种方法不可取,应该一次性和主表一起提交,要么全部成功,要么全失败。
      

  2.   

    楼主的写法是可以的.不过这几句是有问题的.if (mainResult <= 0)
                    {
                        myst.Rollback();
                        con.Close();
                    }if (itemResult <= 0)
                        {
                            myst.Rollback();
                            con.Close();
                            return false;
                        }
    这两个判断是多余的.去掉.因为只有事务提交后才会有返回结果.
      

  3.   

    这个是可以的啊,循环还了再提交事务嘛,出错了就回滚嘛,不过你第一个回滚没有意义,因为mainResult=0,本身就没有写入数据库,第二个回滚和最后一次出错了回滚同理。