问题描述:
    我有一个本地方法,修改数据库a中的表b的一行数据
    然后引用一个webservice,里面有一个方法,插入c数据库中表d的一行数据
现在我要两个操作要么都成功,要么都失败
变态扩展
    引用一个webservice,修改数据库a中的表b的一行数据
    然后引用一个webservice,里面有一个方法,插入c数据库中表d的一行数据
现在我要两个操作要么都成功,要么都失败

解决方案 »

  1.   

    因为是两个webservice,调用者是不能控制其事务的.如果不能把两个webservice合成一个,那就要某个webserive提供一个取消的方法,并且取消也会有失败的时候,还要增加对帐功能.
      

  2.   

    如一楼朋友所述,无法控制.1,把两步操作合成一步,用一个service来控制. 在待用方法的内部 如果两次要操作的表不处于同一个库(比如c,d一个库,ab另一个库),那么可以采用分布式事务
    实现相对简单, 不过藕合性比较高。2,提供取消方法:
    setp1
    update d (x) select x from c
    if step1.error
       rollback
    else
    {   call webservice.operaterMethod
       if thisMethod.error
       {    rollback
           call webservice.rollbackMethod
       }
    }难度在于 webService.rollbackMethod 的实现, 因为你无法直接利用现成的数据库方式来实现,要记录一些当时的操作的原始数据,还要考滤并发时的情况。 需要详细和严谨的设计
      

  3.   

    参考数据库原理课程中关于事务内部故障的处理方法,不过有些麻烦,需要自己建立一个日志表,调用前先写日志文件(记录了插入的数据),出错后就撤销事务(反向扫描日志文件)
    考虑分布式日志中只需加个事务ID(比如使用登录用户的ID)即可。