Java 在两个不同的数据库中同时在两个表上执行事务

Java 在两个不同的数据库中同时在两个表上执行事务,java,sql-server,spring-boot,transactions,spring-mybatis,Java,Sql Server,Spring Boot,Transactions,Spring Mybatis,我有springboot应用程序,其中mybatis作为我的ORM。我还使用了SQLServer2012 我考虑以下情况: void foo () { set current datasource as Datasource D1 (connected to database D1) do some insert on table T1 in database D1 set current datasource as Datasource D2 (connected to

我有
springboot
应用程序,其中
mybatis
作为我的ORM。我还使用了SQLServer2012

我考虑以下情况:

void foo () {
    set current datasource as Datasource D1 (connected to database D1)
    do some insert on table T1 in database D1
    set current datasource as Datasource D2 (connected to database D2)
    do some insert on table T1 (the same name) in database D2
}
我希望能够确保它始终成功执行两个查询。否则(当其中至少有一个失败时),事务将在两个数据库中回滚(我的意思是没有更改)(即使其中一个查询成功)

我认为上面的
@Transactional
是不够的。
foo()

有可能获得这种效果吗?

SQL Server提供了管理跨数据库和/或服务器分布的事务的能力。您可以使用
begindistributedtransaction

如前所述,没有

简言之:无论你尝试什么,在某些极端情况下都是行不通的。正确的解决方案:

  • 在数据库1中插入数据(带有事务)
  • 创建从数据库1读取数据并更新数据库2的cron作业
  • 确保作业可以再次运行(因此它应该总是复制所有数据,或者应该记住它处理的最后一行)
这样,您总是有简单的事务。当出现问题时,您可以重新启动该过程。不可能有数据丢失,最坏的情况是DB 2落后一段时间


将DB 1中的数据插入两个表(一个是您已经拥有的表,另一个是为传输作业处理而优化的“传输”表)也可能有帮助。

如果您像这样执行第二次插入“插入D2.T1”然后,您可以在一个调用中同时执行两个INSERT语句。您必须针对每个数据库管理一个事务。我不理解您的答案。伙计们,你们能说得更准确些吗?我不知道这是否解决了您的事务问题,但您可以在连接到数据库D1时从数据库D2插入一个表。为此,只需在tablename之前添加数据库名和两个句点。示例插入db2..table1