一尘不染

使用Spring和Hibernate在多个数据库中进行分布式事务的“最佳”方法是什么

hibernate

我有一个应用程序-更像是一个实用程序-它位于角落,并定期更新两个不同的数据库。

这是一个使用Spring Application
Context构建的小独立应用程序。上下文中配置了两个Hibernate会话工厂,依次使用Spring中配置的Commons DBCP数据源。

当前没有事务管理,但是我想添加一些。对一个数据库的更新取决于对另一个数据库的成功更新。

该应用程序不位于Java EE容器中,而是由从外壳程序脚本调用的静态启动器类引导的。启动器类实例化应用程序上下文,然后在其一个bean上调用一个方法。

围绕数据库更新进行事务处理的“最佳”方法是什么?

我将“最佳”的定义留给您,但我认为它应该具有“易于设置”,“易于配置”,“廉价”和“易于打包和重新分发”的功能。自然,FOSS会很好。


阅读 229

收藏
2020-06-20

共1个答案

一尘不染

在多个数据库上分布事务的最佳方法是:不。

有人会将您指向XA,但XA(或“两阶段提交”)是一个谎言(或市场说法)。

想象一下:在第一阶段告诉XA管理器它可以发送最终提交之后,到其中一个数据库的网络连接失败。怎么办?超时?这将使另一个数据库损坏。回滚?两个问题:您无法回滚提交,又如何知道第二个数据库发生了什么?在成功提交数据后,网络连接失败了,只有“成功”消息丢失了吗?

最好的方法是将数据复制到一个地方。使用允许您中止副本并随时继续进行复制的方案(例如,忽略已拥有的数据或按ID排序选择,仅请求记录>副本的MAX(ID))。通过交易保护它。这不是问题,因为您只从源中读取数据,所以当事务由于任何原因失败时,您可以忽略源数据库。因此,这是一个普通的单源交易。

复制数据后,请在本地进行处理。

2020-06-20