我有一个场景,其中工作单元定义为:
Update table T1 in database server S1
Update table T2 in database server S2
而且我希望上述工作单元完全发生或根本不发生(与任何数据库事务一样)。我怎样才能做到这一点?我广泛搜索并找到了这个 post接近我的预期,但这似乎是 Hibernate 特有的。
我正在使用 Spring、iBatis 和 Tomcat (6.x) 作为容器。
最佳答案
这实际上取决于您需要多稳健的解决方案。这种事情的最低可靠性是 XA 事务。要使用它,您需要一个数据库和支持初学者的 JDBC 驱动程序,然后您可以配置 Spring 来使用它(here 是一个大纲)。
如果 XA 对您来说不够健壮(XA 有故障场景,例如在提交的第二阶段出现问题,例如硬件故障),那么您真正需要做的是将所有数据放入一个数据库,然后有一个单独的进程传播它。所以数据可能不一致,但是是可以恢复的。
编辑:我的意思是将所有数据放入一个数据库中。第一个数据库,或用于此目的的不同数据库。该数据库本质上将成为一个队列,从中提供最终数据 View 。对该数据库的写入(假设是一个体面的数据库产品)将完成,或者完全失败。然后,一个单独的线程将轮询该数据库并将任何丢失的数据分发到其他数据库。因此,如果进程失败,当该线程再次启动时,它将继续分发进程。数据可能不会立即存在于您希望它存在的每个地方,但不会丢失任何内容。
关于java - 处理跨数据库服务器的事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1499472/