处理跨数据库服务器的事务

时间:2009-09-30 17:08:19

标签: java spring tomcat transactions ibatis

我有一个工作单元定义为:

的场景
Update table T1 in database server S1
Update table T2 in database server S2

我希望上述工作单元完全发生或根本不发生(如同任何数据库事务一样)。我怎样才能做到这一点?我进行了广泛的搜索,发现这个post接近我所期待的,但这似乎对Hibernate非常具体。

我使用Spring,iBatis和Tomcat(6.x)作为容器。

2 个答案:

答案 0 :(得分:6)

这实际上取决于您需要的解决方案的稳健性。这种事情的最低可靠性是XA事务。要使用它,你需要一个支持初学者的数据库和JDBC驱动程序,然后你可以配置Spring使用它(here是一个大纲)。

如果XA不够强大(XA有故障情况,例如在提交的第二阶段出现问题,例如硬件故障),那么您真正需要做的就是将所有数据放入一个数据库,然后有一个单独的进程传播它。因此数据可能不一致,但可以恢复。

编辑:我的意思是将整个数据放入一个数据库。第一个数据库,或者用于此目的的不同数据库。该数据库基本上将成为从中提供最终数据视图的队列。写入该数据库(假设一个体面的数据库产品)将完成或完全失败。然后,一个单独的线程将轮询该数据库并将任何丢失的数据分发给其他数据库。因此,如果进程失败,当该线程再次启动时,它将继续分发过程。数据可能不会存在于您希望它立即出现的每个地方,但不会丢失任何内容。

答案 1 :(得分:2)

您需要分布式事务管理器。我喜欢使用可以在JVM中运行的Atomikos