Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 处理跨数据库服务器的事务_Java_Spring_Tomcat_Transactions_Ibatis - Fatal编程技术网

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

Java 处理跨数据库服务器的事务,java,spring,tomcat,transactions,ibatis,Java,Spring,Tomcat,Transactions,Ibatis,我有一个场景,其中工作单元定义为: Update table T1 in database server S1 Update table T2 in database server S2 我希望上述工作单元要么完全发生,要么根本不发生(就像任何数据库事务一样)。我该怎么做?我进行了广泛的搜索,发现这与我期望的非常接近,但这似乎是Hibernate特有的 我使用Spring、iBatis和Tomcat(6.x)作为容器。这取决于您需要的解决方案的健壮性。这种事情的最低可靠性级别是XA事务。要使用

我有一个场景,其中工作单元定义为:

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中运行的工具。

基于FOSS的解决方案将非常有用。JBoss事务管理器是开源的,可以在不需要整个JBoss容器的情况下使用。而且您的两个数据库都需要支持XA—不是每个人都需要,它们的稳定性/功能级别可能会令人担忧。“如果XA对您来说不够健壮,那么您真正需要做的是将所有数据放在一个数据库中,然后让一个单独的进程传播它”您能解释一下这一点吗?您所说的“将所有数据放在一个地方”和“单独的进程传播它”是什么意思@peakit,看看他们的网站,他们有一个免费的(实际下载需要注册)Apache 2.0许可版本,以及更高级的封闭源代码版本。