加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

oracle – 两阶段提交/共享事务

发布时间:2020-12-12 13:13:14 所属栏目:百科 来源:网络整理
导读:情景是这样的 我们有两个应用程序A和B,它们都在单独的数据库(Oracle 9i)事务中运行 应用程序A – 将一些数据插入数据库,然后调用应用程序B. 应用程序B – 将一些数据插入数据库,与A的数据相关(通过外键).返回应用程序A的“ID” 应用程序A – 使用ID插入更多
情景是这样的

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

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

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

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

——更新——–

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

解决方法

你有三个选择:

>重新设计应用程序,以便您没有两个不同的进程(都有数据库连接)写入数据库并将其滚动到一个应用程序中.
>创建处理A和B的所有数据库事务的应用程序C.
>滚动您自己的两阶段提交.应用程序C充当协调者. C发信号A和B询问他们是否准备好提交. A和B进行处理,并使用“就绪”或“失败”回复来响应C(请注意,如果一个进程挂起或死亡,C上应该有超时以避免无限等待).如果两个回复都准备就绪,那么C告诉他们提交.否则它会发送回滚信号.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读