oracle - 两阶段提交/共享交易

标签 oracle

场景是这样的
我们有两个应用程序 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 之前开始。只是一个警告。

    关于oracle - 两阶段提交/共享交易,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/89320/

    相关文章:

    sql - 首先强制子查询解析

    SQL:如果存在相关记录,则返回 true/false

    java - 从可调用语句 OUT 参数中检索意外的 null

    sql - 查找序列中未缺失的列中的上一个数字

    java - Hibernate 中的动态查询

    java - 使用分页检索 Hibernate 关联实体

    java - SQL 查询仅返回 SELECT 语句中第一列的值

    java - 如何监视特定对象(如 Clob\Blob)的 Oracle 临时空间

    oracle - 回滚@Oracle 上的存储过程

    linux - 如何在 Linux 6 上保存 Method R Workbench 的许可证 key ?