问题标签 [2phase-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 投票
1 回答
815 浏览

java - 将 XA 与本机不支持它的数据库一起使用?

是否有一个开源 Java 库可以将 XA 支持添加到本机不支持它的数据库中?也就是说,它包装了一个非 XA JDBC 数据源,并在幕后为两阶段提交处理必要的提交/回滚?

0 投票
1 回答
2516 浏览

transactions - 两阶段提交 - 如何有效地使用我的队列?

我要描述的本质上是两个不同系统之间的两阶段提交问题,我正在寻找有关如何处理它的建议。在我们的 Web 应用程序中,我们将一些昂贵的/第 3 方操作(例如发送电子邮件)卸载到带外后台工作进程(我们称之为工作基础架构)。

例如,要发送电子邮件,我们在数据库中创建电子邮件对象和电子邮件作业。然后,我们必须等待我们的作业监视器接收电子邮件作业并将其发送。作业监视器的工作原理是在空闲时每隔几秒轮询一次数据库。

然而,这增加了电子邮件发送的延迟,并通过轮询增加了我认为对数据库的过度负载。如果我们可以在创建电子邮件后立即将电子邮件作业放入队列中,那就更好了。

然而,这目前由于两个原因而失败。首先,队列通常比 Web 请求快得多。电子邮件在 Web 请求提交其数据库事务之前被拾取进行处理,因此它无法正确生成电子邮件。其次,如果 Web 请求失败,它会回滚其数据库事务,这意味着不应发送电子邮件。但是,如果它已经被放入队列,那么它就不再受请求的控制。

是否有在队列和数据库之间创建两阶段提交的好策略?作为参考,我们将 RabbitMQ 和 MySQL 与 InnoDB 表一起使用。我想到的一个想法是在提交数据库事务后将电子邮件作业保留在队列中,但这会留下电子邮件永远不会排队的可能性。我仍然需要创建一个轮询过程来监视应该发送和未发送的电子邮件。

0 投票
3 回答
2529 浏览

php - 两阶段提交 - 寻找实现

我正在寻找两阶段提交协议的实现,是的,我是分布式事务的新手 :) 必须在 php 应用程序和远程“应用程序”(系统)之间实现两阶段提交。

我是否必须从头开始实施两阶段提交?您是否知道以任何语言实现的任何模块可以让我领先一步?

- 直到现在还没有找到太多关于此的内容:)

感谢任何帮助。

0 投票
1 回答
969 浏览

jakarta-ee - 多个 REST 调用可以参与分布式事务吗?

这是场景,顺便说一句,我正在寻找以 Java 为中心的答案。

  1. 客户端代码从 Provider Application #1 调用 REST 服务 A (POST)。
  2. 客户端代码使用 JDBC 直接更新内部数据库。
  3. 客户端代码从 Provider Application #2 调用 REST 服务 B (POST)。
  4. 步骤 1 到 3 需要发生在具有两阶段提交支持的分布式事务中,即如果步骤 2 的数据库更新失败,那么我们要撤消步骤 1 的 POST。如果步骤 3 的 POST 失败,我们想要撤消步骤 1 的 POST 和步骤 2 的数据库更新。

有没有一种方法可以使用 JTA 完成此任务,而无需编写我们自己的补偿代码(撤消步骤 1 和 2)?

0 投票
0 回答
11991 浏览

jakarta-ee - XAException:由于 XA 异常,两阶段提交回滚失败

好的,一个看似简单的两阶段提交实现遇到了问题。我的设置是一个 DB2 服务器上的 2 个数据库,一个托管在 Websphere 6.1 上的应用程序。由 Atomikos 处理的事务管理。通过 jndi 连接数据库。我开始 UserTransaction,在 DB1 上执行更新,在更新到 DB2 时失去与 DB 的连接以获得调用回滚的StaleConnectionException 。现在理想情况下,TM 应该为事务执行回滚。但是,我得到一个 XAException 如下:

在此之后执行更新的 DB1 表被锁定。到目前为止,我已经尝试了以下方法,但仍然无法执行回滚:

  1. 查询正在使用未提交的读取('ur')
  2. 连接自动提交设置为 false,IsolationLevel 设置为 *TRANSACTION_READ_UNCOMMITTED*
  3. 增加了数据源和事务服务的各种超时值。
  4. 连接池最小连接数设置为 0,清除策略:EntirePool
  5. 正在捕获StaleConnectionException并从 catch 块调用 UserTransaction.rollback()。

如何使用两阶段提交和 XAtransactions 从数据库崩溃中恢复?任何指向应该为此做些什么的指针?

0 投票
4 回答
4690 浏览

java - 如何模拟数据库失败以在 Java 中测试两阶段提交

我正在实施涉及分布式资源的两阶段提交。如何模拟参与数据库的故障?拔网线不起作用,因为它会导致表死锁。我目前在我的应用程序代码中使用钩子,这些钩子在StaleConnectionException查询执行之前和查询执行之后抛出不同的点。我对这种方法的担忧是:

  • 有没有更好的方法来模拟数据库故障?
  • 当 DB 连接变坏时,连接对象会发生什么?它是保留其价值还是变为空?
  • 当应用程序尝试重新连接到数据库时实际发生了什么?连接对象得到什么值?它是否使用连接池中的现有值?

我还想在查询执行期间、提交期间(发送准备后等)等中间点进行测试。现在我将应用程序置于调试模式并进入函数调用并在两者之间插入插件。但这种方法是手动的,不适用于规模测试。

有没有模拟器/模拟器或工具可以帮助我做到这一点?

0 投票
1 回答
6675 浏览

spring - 使用 Atomikos 的两阶段提交 (2PC) 配置

我正在创建一个示例应用程序来测试两阶段提交 (2PC)。我从互联网上获取了这里使用的代码位。我使用 Spring、Hibernate 和 Atomikos 以及 MySQL 作为后端。我正在使用两个数据库并故意对第二个数据库的调用无法检查第一个数据库调用是否回滚。可悲的是,它似乎不起作用。有人可以指出一些带有一些示例代码的链接吗?

以下是我的配置:
Hibernate 会话工厂:

数据源配置:

Spring JTA 配置:

我有两个 DAOImpl,我将上面定义的两个 sessionFactories 注入其中。以下是来自 Java 代码的调用:

任何指针都会有很大帮助。

谢谢

0 投票
1 回答
1139 浏览

database - 两阶段提交是否可以防止最终提交失败?

假设分布式事务中涉及的所有数据库都使用两阶段提交信号实现了它们已准备好提交并拥有必要的锁。协调器发出提交信号,所有数据库都执行它们的事务部分,但是一个 SQL 数据库遇到被零除的错误,这是由于编程疏忽而没有考虑到这种可能性。既然协调员已经向每个人发出了承诺信号,那么除以零会发生什么?

0 投票
2 回答
2025 浏览

couchdb - 同时使用图形数据库和文档数据库

我正在考虑一种设置,其中我将实体存储在文档数据库(例如 CouchDB)和图形数据库(例如 Neo4j)中。基本原理是将每个实体信息(数据、blob、值、复杂的内部结构)存储在文档数据库中,同时将实体关系(父、子、关联实体)存储在图形数据库中。

有没有人做过/看到/被这样的设置咬过?我应该期待什么样的问题?首先想到的是两阶段提交。但是备份在这里也有问题。

0 投票
1 回答
681 浏览

ejb-3.0 - weblogic ejb3 两阶段提交

任何人都可以用 ejb3 教程指出我在 weblogic 上的一个很好的两阶段提交吗?

我环顾四周,发现只有一个,但它不使用 XA。