问题标签 [two-phase-commit]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
64 浏览

java - 实现 Oracle 和 MongoDB 之间的“全有或全无”事务

我有一个用例(通过 Java 应用程序将数据从 Oracle 迁移到 MongoDB),我需要在其中实施事务管理以确保数据存储中的“全有或全无”。

  1. 从 Oracle 表中读取输入数据(例如:sourcetable)。
  2. 使用该输入执行两个单独的存储过程并处理输出游标并构造两个不同的 Mongo 文档(分别对同一数据源 [collection1 和 collection2] 中的两个不同集合感兴趣)。
  3. 如果上述步骤成功完成,则将上述 Oracle 表(例如:sourcetable)更新为迁移成功状态。
  4. 仅当上述所有步骤都成功完成后,才执行提交(MongoDB 和 Oracle)。
  5. 如果任何步骤出现任何错误,则对整个事务执行回滚。

我看到 Oracle 提供了两阶段提交,而 MongoDB 提供了分布式事务来分别实现这些事情,但我一直在寻找共同实现它的方法。另外,我不知道如何实现它,或者这是否是我用例的正确解决方案。我非常感谢任何指导或伪代码实现。

注意:所有这些过程都将在分布式环境中执行。

0 投票
0 回答
26 浏览

database - 死锁发生在 2 个阶段锁定

我浏览了这个事务表,但我无法确定存在死锁。这两个事务中真的存在死锁吗?

在此处输入图像描述

我的回答——>

在此处输入图像描述

我找不到任何死锁,只有互斥,事务 T2 等待事务 T1 解锁排他锁,事务 T1 不请求事务 T2 中使用的任何锁?我错了吗?

0 投票
0 回答
14 浏览

distributed-transactions - 为什么两阶段提交需要协调者在失败的情况下“复活”?

我不明白为什么无法在协调器失败时取消阻止事务,如下所示:

  1. 查询所有接受者节点并询问他们的交易状态。他们是否处于准备状态?
  2. 如果它们都处于准备状态,那么您可以启动一个新的协调器并告诉它前一个协调器的最后一个事务在所有接受器中都达到了准备状态,因此您现在应该通过发送提交消息来恢复它。

上面的解决方法不是允许 2PC 使用新的协调器解除阻塞吗?为什么我们说 2PC 需要协调器“复活”才能解锁交易?