我以前经常要做这样的事情:
web服务接收上传的文件后,程序做两步动作:
1:将上传文件的文件名,等其它信息存入数据库。
2:将文件存为本地文件。
在这样的一个操作中,如果第一步成功,而第二步失败,那么系统中就会有不一致状态。比如数据库中记录某个文件路径和名称,但是因为第二步失败所以文件系统中并没有指定的文件。
当时我想如果有某种机制把这两个操作组合在一个事务里边(当然我这种情况并非必要,只要数据库操作先不提交,等存文件的工作完成后在提交),如果事务回滚,往文件系统写文件的操作也能撤消,那可就真强了。为了这个问题,今天我特意看了一下jta的资料,本以为jta就是处理此类事情的,其实不然!jta只对自己事务边界内的数据库操作或其它拥有xaresource资源(或者说遵循了xa协议的操作)的操作发生作用。比如用一个事务来组合对几个不同数据库连接的操作这类情况下,jta非常合适。但是比如对我的写文件,或者往socket发送流 等等操作,是否也可以用jta或其它机制来组装成一个事务呢?请大家指教!

解决方案 »

  1.   

    "那你只有自己定义事务了"
    大侠,关于我举的这个例子,我确实可以等到文件操作完成后再提交数据库操作。但是我想,当前java的事务机制中,包括jta,ejb的事务机制,由没有满足我所说的要求的一种呢?再有,你说的 “自己定义事务” 具体指的是怎样?望赐教!
      

  2.   

    你自己也看了,既然jta无法判断你的事务,那你就自己判断。自己定义事务就是你在你的程序里面判断第二步是否成功,如果不成功则删除数据库相应的纪录。假如你的第二步可以用if判断。if(第二步不成功){
       将存入数据库的数据删除;这样你的数据库不就相当于回滚了。
    }
      

  3.   

    ejb的容器事务控制应该可以做到这一步功能。我再去学习学习
      

  4.   

    web服务接收上传的文件后,程序做两步动作:
    1:将上传文件的文件名,等其它信息存入数据库。
    2:将文件存为本地文件。
    --------------------------------------------
    你的逻辑有点问题:如果文件上传成功与否,对于业务而言很重要,那么,这个操作应该是关键操作,
    如果该操作没有成功完成,那么,就不应该发生其他相关操作。所以,你应该首先做文件上传的操作,然后判断文件上传是否成功,
    如果成功,再做插入数据等操作。这些同一事务的操作,
    是可以做统一处理的,
    不过,要自己写~
      

  5.   

    upload.......if(isSuccess){
      insert database
    }else{
     不用处理了 因为没上传成功
    }好象和事务不是很搭介的一个逻辑
      

  6.   

    先传文件再改数据库的确是更符合逻辑,但是可能会出现文件上传成功,但是插入数据库时失败,这时文件已经存在,但是数据库中没有记录,则一样造成数据不一致和冗余。
    不过好象可以在抛出SQLException后把文件删掉就行了!我有一个类似的问题,如果我在写文件中一行一行地写,而每一行的字符都需要有数据库的支持,而且不止一个statement,那么如果中间出现异常,我前面的字符已经写入文件,而后面的又没有写入不就出现问题了吗?这个怎么做成事务呢?难道也是在异常中把文件直接删除?