当前位置:  开发笔记 > 编程语言 > 正文

两阶段提交/共享事务

如何解决《两阶段提交/共享事务》经验,为你挑选了1个好方法。

情景是这样的

我们有两个应用程序A和B,它们都在单独的数据库(Oracle 9i)事务中运行

应用程序A - 将一些数据插入数据库,然后调用应用程序B应用程序B - 将一些数据插入数据库,与A的数据相关(通过外键).返回应用程序A的"ID"应用程序A - 使用ID插入更多数据,包括来自B的ID

现在,因为这些是单独的事务,但都依赖于来自彼此的事务数据,我们需要在每个应用程序的调用之间进行提交.这当然使得如果出现任何问题就很难回滚.

如何通过最少的代码重构来解决这个问题.当然这种情况在SOA世界中是一个常见问题吗?

------更新--------

我无法在Oracle 9i中找到任何东西,但是Oracle 11g提供了DBMS_XA,它完全符合我的要求.



1> Zathrus..:

你有三个选择:

    重新设计应用程序,以便您没有两个不同的进程(都有数据库连接)写入数据库并将其滚动到一个应用程序中.

    创建应用程序C,处理A和B的所有数据库事务.

    滚动你自己的两阶段提交.应用程序C充当协调者.C发信号A和B询问他们是否准备好提交.A和B进行处理,并使用"就绪"或"失败"回复来响应C(请注意,如果一个进程挂起或死亡,C上应该有超时以避免无限等待).如果两个回复都准备就绪,那么C告诉他们提交.否则它会发送回滚信号.

请注意,如果应用A依赖于来自应用B的外键(您没有说明,那么这可能不是问题),您可能会遇到选项3的问题.Oracle的读取一致性可能会阻止这种情况被允许,因为应用A的事务将在应用B之前开始.只是一个警告.

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有