我有一个场景,工作单元定义为:
Update table T1 in database server S1
Update table T2 in database server S2
而且我希望上述工作单元完全发生或根本不发生(与任何数据库事务一样)。我怎样才能做到这一点?我进行了广泛的搜索,发现这篇文章与我的预期很接近,但这似乎是 Hibernate 特有的。
我使用 Spring、iBatis 和 Tomcat (6.x) 作为容器。
这实际上取决于您需要的解决方案有多强大。此类事物的最低可靠性级别是 XA 事务。要使用它,您需要一个支持它的数据库和 JDBC 驱动程序,然后您可以配置 Spring 来使用它(这里是一个大纲)。
如果 XA 对您来说不够健壮(XA 有故障场景,例如提交的第二阶段出现问题,例如硬件故障),那么您真正需要做的是将所有数据放在一个数据库中并然后有一个单独的进程传播它。所以数据可能不一致,但可以恢复。
编辑:我的意思是将所有数据放入一个数据库中。用于此目的的第一个数据库或不同的数据库。该数据库本质上将成为一个队列,从中提供最终数据视图。对该数据库的写入(假设是一个不错的数据库产品)将完成,或者完全失败。然后,一个单独的线程将轮询该数据库并将任何丢失的数据分发到其他数据库。因此,如果进程失败,当该线程再次启动时,它将继续分发进程。数据可能不会立即出现在您想要的每个地方,但不会丢失任何东西。
您需要一个分布式事务管理器。我喜欢使用可以在 JVM 中运行的Atomikos 。