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

时间:2017-03-30 13:05:53

标签: java sql-server spring-boot transactions spring-mybatis

我的spring-boot应用mybatis作为我的ORM。我也使用sqlserver 2012

我考虑以下情况:

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()是不够的 是否有可能获得这种效果?

2 个答案:

答案 0 :(得分:0)

SQL Server提供了管理跨数据库和/或服务器分布的事务的功能。您使用BEGIN DISTRIBUTED TRANSACTION

启动分布式事务

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/begin-distributed-transaction-transact-sql

答案 1 :(得分:0)

不,正如here所述。

简而言之:无论你怎么做,它都不会在某些角落里工作。正确的解决方案:

  • 将数据插入数据库1(带事务)
  • 创建一个从数据库1读取数据并更新数据库2的cron作业
  • 确保您的作业可以再次运行(因此它应该始终复制所有数据,或者它应该记住它已处理的最后一行)。

这样,您总是有简单的交易。当出现问题时,您可以再次启动该过程。没有数据丢失,最糟糕的情况是DB 2滞后了一段时间。

将DB 1中的数据插入两个表(您已经拥有的表和一个" transfer"表,该表经过优化以便由传输作业处理)也可能有帮助。