首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >两阶段提交/共享事务

问两阶段提交/共享事务
EN

Stack Overflow用户
提问于 2008-09-18 01:56:28
回答 5查看 5K关注 0票数 4

场景是这样的

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

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

现在,因为它们是独立的事务,但都依赖于彼此事务中的数据,所以我们需要在对每个应用程序的调用之间提交。当然,如果出现任何错误,这将使回滚变得非常困难。

你将如何处理这个问题,并对代码进行最小程度的重构。这肯定是SOA世界中的一个常见问题吧?

--更新

我在Oracle9i中找不到任何东西,但是Oracle11g提供了DBMS_XA,它做的正是我想要的。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2008-09-18 02:20:27

您有三个选项:

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

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

票数 11
EN

Stack Overflow用户

发布于 2008-09-18 07:28:48

以下是一些建议:

  • 使用Compensating transactions。基本上,您可以撤消之前执行的事务。困难的部分是找出使用指示它只是临时的标志来将应用程序A和B的数据rollback.
  • Commit到数据库的事务。然后,在一切正常后,修改标志以指示数据是最终数据。在夜间,运行批处理作业以清除尚未最终确定的数据。
票数 3
EN

Stack Overflow用户

发布于 2008-09-18 02:30:03

您可能会将来自应用程序A的数据插入到“临时”区域中,以便应用程序B可以执行A和B的插入,而不需要在这两个应用程序中做太多更改。它不是特别优雅,但它可能会起到作用。

在另一个场景中,您可以向您的数据添加一个“确认”标志字段,该字段在整个流程成功运行后更新。如果在某一时刻失败,可能更容易追踪到需要回滚的记录(实际上是删除)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/89320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档