【发布时间】: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