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