Java中文件操作的事务模式
也许我想在这里解释没有任何意义,所以我想提前道歉。 无论如何,我会尝试。
我试图从文件读取,执行一些数据库操作,并将内容移动到另一个文件。 我想知道是否可以在Java中以primefaces方式执行所有这些操作,因此如果在操作列表中出现任何错误,请回滚完整序列并返回到起始点。
在此先感谢您的帮助。
看看Apache Commons Transaction 。 它有能力以事务方式pipe理文件。
一篇存档的文章详细介绍了它在文件系统中的使用。
没有标准的事务文件API,但我相信有一个Apache项目,实现你想要的。
http://commons.apache.org/transaction/file/index.html
事务文件包为您提供了代码,使您可以在任何文件系统上进行primefaces读取和写入操作。 文件资源pipe理器为您提供了隔离事务中的一组文件上的多个操作的可能性。 使用锁包可以为您提供完整的ACID事务,包括可串行化。 当然,为了完成这个工作,所有对托pipe文件的访问都必须由这位经理完成。 直接访问文件系统不能由pipe理员监视。
由于XADisk支持文件系统上的XA事务,它应该解决您的问题。 它可以与数据库和其他XA资源一起参与XA事务。
如果您的应用程序不在JCA支持环境中,则还可以使用独立的事务pipe理器(如Atomikos),并执行涉及这两个文件(使用XADisk)和数据库的XA事务。
不,至less不是用简单的电话。 一般的文件系统(特别是Java文件系统操作)不支持“回滚”。
你可以模仿这个。 一个常见的方法是首先重命名文件,使其被标记为“处理中”。 例如追加一些后缀。
然后处理它,然后更改文件。 如果出现任何问题,只需回滚数据库,将所有带有后缀的文件重命名为原来的名称,然后进行设置。
作为奖励,在某些FS上重命名甚至是primefaces的,所以即使并发更新也是安全的(不知道这是否与你相关)。 我不知道Java中的文件重命名是否是primefaces的, 你需要检查。
您可以使用两阶段提交来协调分布式事务。 然而,这实现相当复杂,我经常看到的一种方法是使用单阶段提交,构build一堆事务,然后快速连续提交它们,如果其中一次提交尝试失败,则会生成一个错误,但是,别人成功了。
如果您select实施两阶段提交,则需要对交易中的每个参与者进行预先写入日志logging ,在这些日志logging之前logging操作,以便在事务失败时回滚任何更改。 例如,你需要这样做,以便有可能逆转对文件所做的任何更改(如sleske提及)。
作为Narayana项目(以前称为JBossTS)的一部分,JBossTS提出了自己的事务性文件I / O实现。