有一个这样的场景:DB里面存着一个普通文件的信息,譬如说size, path, lastModifyDate....,当然这对应一个真的文件在操作系统上。如果我要通过一个j2ee的application去写这个文件,同时修改DB里面对应的纪录的时候,transaction问题就来了。万一file操作和DB操作有一个失败如何rollback?OK.我们知道DB操作可以有transaction控制,但是file操作呢?EJB的种种令人头痛的限制里面就有不得直接操作I/O(file)...
如果不在EJB容器,就应该直接可以使用JTA?但是JTA能直接控制I/O来做2阶段提交?或者最后一招,自己写file的rollback()函数,自己控制2个操作的事务。。better solution?

解决方案 »

  1.   

    两阶段提交是数据库提供的功能,J2EE 容器只是一个协调者。另外,文件操作是不存在事务的。
      

  2.   

    果子前辈,这里我有一个疑问。
    事务的存在是为了保证一系列原子操作都能正确成功完成或全部回滚,java只要操纵内存之外的任何数据(网络、数据库、本地文件)都有出错和操作不成功的可能,为何数据库存在事务而本地文件不存在事务这个概念??
    一时想不通,呵呵,还望指出。
      

  3.   

    consider XA enabled file system transactions.
      

  4.   

    可是我妈妈一共给了我50 包括我一周的早饭钱 我买了4个山竹 我兜兜里就10多块了 话说回来 
    事务的存在是为了保证一系列原子操作都能正确成功完成或全部回滚,java只要操纵内存之外的任何数据(网络、数据库、本地文件)都有出错和操作不成功的可能,为何数据库存在事务而本地文件不存在事务这个概念?? 
      

  5.   


    因为文件系统不支持事务操作,至少我们新建、修改、删除一个文件并不需要点一下“提交”按钮才能成功的。事务文件系统目前应该还处于初级阶段。参考:http://www.infoq.com/cn/news/2008/01/file-systems-transactions
      

  6.   

    据悉 Apache Commons Transaction 可以支持文件的事务操作,我也只是刚看来的,也从来没有用,有兴趣的话可以去看一下:http://commons.apache.org/transaction/