或者如下的组合:
1)
A:插入数据到MSSQL
B:插入记录到XML
2)
A:插入数据到XML1
B:插入数据到XML2
3)
A:创建XML文件1
B:插入数据到XML2
//请问以上组合中,如果B出现异常的时候,
怎么让上面操作回滚?

解决方案 »

  1.   

    对于1好回滚,操作mssql的时候增加事务,当b操作成功后才进行提交即可。
      

  2.   

    对于2、3你可以用DataSet来临时存取,这样操作就比较好回滚。
      

  3.   

    对于2)
    如果用DataSet来临时存取的话
    1.你的意思是将记录读到DataSet中,再在里边添加记录,
    然后再复写入XML?
    如果是这样的话,写入的过程中,依然有一个先后的问题,
    如果写入XML1的时候,没有异常,而写入2)的时候,出现
    异常,这样的话,回滚不了吧?2)如果读到DataSet中处理的话,在数据量大的时候,
    占用的内存应该比较大。3)对于创建文件,不能用DataSet来解决吧?
      

  4.   

    to DataSet操作如果是DataSet的话,相对的操作就比较简单了。对于回滚或者不回滚的话,DataSet提供了RejectChanges以及AcceptChanges这两个方法对应。存文件,可以采用DataSet.WriteXml方法去写入。
      

  5.   

    对于回滚或者不回滚的话,DataSet提供了RejectChanges以及AcceptChanges这两个方法对应。
    //这两个只能说是对没有插入到XML文件以前,在DataSet中
    的数据进行回滚。比如:
    DataSet  ds1 = new DataSet();
    DataSet  ds2 = new DataSet();
    try
    {
        ds1.ReadXML(path);
        ds2.ReadXML(path);    //这里是修改代码
        ds1.AcceptChanges();
        ds2.AcceptChanges();
        ds1.WriteXml(path);
        ds2.WriteXml(path);}
    catch(Exception ex)
    {
        //如果在ds2.WriteXml(path);这里报异常
        //用RejectChanges回滚不了吧?
    }
    //如果到ds2.WriteXml(path);的时候,不是报异常,
    而是忽然中断呢?又怎么回滚?
      

  6.   

    我想到的解决方案是:
    在XML里每一行加一个标识<Flag>0</Flag>
    为0的时候,不可用,为1的时候可用,当出现异常时,删除不可用的记录,
    如果突然中断,也不会有影响,因为记录是标识无效的,
    当下次异常的时候,就会把这次无效的记录删除。//不好的地方在于,每个文件都要加一个<Flag>0</Flag>
    各位看官是否有更好的解决方案?