【问题标题】:How to create a multi-database transaction in Java?如何在 Java 中创建多数据库事务?
【发布时间】:2016-08-26 19:44:57
【问题描述】:

场景:

  • DB1 和 DB2 各有一个表“T1”
  • 当我在我的服务上调用 insert(..) 方法时,我需要更新两个数据库表。
  • 如果其中一个数据库的更新失败,它们都需要 ROLLBACK。

调查:

  • JTA 分布式事务 - 还没有运气好。

服务电话:

Service.update(id, value);

服务实现伪代码:

@Transactional(value="twoDBTransactionManager")
public class Service {
    TwoDBTransMgr tm = new TwoDBTransMgr(DB1, DB2);

    /** Option #1 **/
    public void updateBoth(id, value) {
        tm.updateBothAndCommit(id, value);
    }

    /** Option #2 **/
    public void update(id, value) {
        tm.updateDB1(id, value);
        tm.updateDB2(id, value);
        tm.commitBoth();
    }

应用程序上下文

<jee:jndi-lookup id="db1" jndi-name="jdbc/db1" resource-ref="true" proxy-interface="javax.sql.DataSource"/>
<jee:jndi-lookup id="db2" jndi-name="jdbc/db2" resource-ref="true" proxy-interface="javax.sql.DataSource"/>

技术:

Oracle 12c、Java 6、Spring、Maven、Hibernate、JNDI

PL/SQL 等效解决方案:

DECLARE
BEGIN
  INSERT INTO t1@TESTLINK (val) VALUES ('DB LINK');
  INSERT INTO t1 (val) VALUES ('NO DB LINK');
  COMMIT;
EXCEPTION WHEN OTHERS THEN
  ROLLBACK;
  RAISE;
END;
/

【问题讨论】:

  • 你需要一个 XA 分布式事务。
  • 这两个数据库不一样,只是几个表而已。
  • 我没有说他们是一样的。
  • 我的错,把你的回答和我之前和别人的谈话搞混了。
  • 所有这些 w/ 的诀窍是什么? :) 你为什么不写with这个词?

标签: java spring oracle hibernate jndi


【解决方案1】:

我之前对这个话题做过同样的研究。似乎没有直接的方法可以实现。

如果 DB1 和 DB2 使用相同的数据库系统(比如说 oracle)。我认为最好使用 DB Link 来执行此操作。

这意味着,您使用单个数据源来访问两个数据库中的表。

【讨论】:

  • 是的,这是最简单的方法,这就是我目前正在做的事情(请参阅 PL/SQL 等效解决方案部分)。虽然最终,我认为这是最好的解决方案,但有时数据库链接是不可能的(例如,由于客户要求)。所以我很好奇在这些条件下你将如何在 Java 中做到这一点。
【解决方案2】:

我认为消息可能是解决此问题的一种方法。假设 A,B 是两个 DB 连接。他们不能互相认识。我们需要另一个组件来沟通。

假设:在交易之前,A,B 向 C 发送一个 msg,并进行一些操作,然后向 c 发送一个 msg 来判断是否正常。然后 C 向 A、B 发送一个 msg,它定义了事务提交或回滚。

就像:

开始:

A---->C

B---->C

给C发消息,告诉C帮忙观察操作员

操作:

A:做一些操作,比

A ---> C 告诉 C 操作成功或失败

B:做一些操作,比

B ---> C 告诉 C 操作成功或失败

A,B 等待,给 C 发送一条消息后,等待 C 的信号形式

结束:

C---> A

C---> B

告诉 A、B 提交或回滚

【讨论】:

  • 这看起来像是在重申我的要求,而不是实际的解决方案。但这可能只是因为“消息”是一个很常见的词。您指的是特定框架吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 2011-04-18
  • 2012-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多