问题标签 [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.
c# - .NET 事务、Mongo DB、2 阶段提交与单阶段提交
我们正在将 Mongo DB 集成为我们基于 .NET 的系统中的数据库。由于我们的系统需要数据一致性,所以我们需要支持事务。Mongo DB v4.0 支持事务,但为了将其与 .NET System.Transaction 机制集成,似乎我们需要为 Mongo 实现一个资源管理器,具有单阶段 (IPromotableSinglePhaseNotification) 或两阶段 (IEnlistNotification)犯罪。
- Mongo C# 驱动程序公开了一个 StartTransaction()、Commit() 和 Rollback() API,它看起来像一个单阶段提交 API,所以看起来我们的资源管理器应该实现单阶段接口。另一方面,我们需要支持分布式事务,所以这适合 2-phase-commit 机制,但是在这种情况下,第一阶段(Prepare)的实现应该是什么?
- 如果有多个 Mongo 事务参与者(例如分布式事务),如果其中一个参与者在 Mongo 驱动程序的 Commit() API 上失败,会发生什么?我应该如何处理所有之前已经承诺的参与者?
microservices - 为什么两阶段提交不适合微服务架构?
我读过一篇文章说:
我们无法在分布式环境中的微服务中实现传统的事务系统,如 2 阶段提交。
我完全同意这一点。
但是,如果这里有人可以解释其确切原因,那就太好了。如果我使用微服务实现两阶段提交,我将面临哪些问题?
提前致谢
database - 分布式事务+强一致性:可行性?
背景:
我知道相当多的大型系统,尤其是在使用分布式事务以及最终一致性的电子商务领域。
问题:
是否有可能拥有具有强一致性保证的分布式事务(通过两个网络资源)。我一直在理论上听到/阅读它(使用 2 阶段提交),但从未有机会遇到这样的系统。
或者根本不可能实现它?任何见解/相关文章表示赞赏。
transactions - 2阶段提交实现
我正在尝试在文档数据库上实现两阶段提交,该文档数据库使用插入数据的事务信息仅支持单阶段提交。
我了解两阶段提交背后的理论,但在实践中存在一些障碍。
假设有一个定义了唯一 ID 的集合,事务包括更新文档的多个字段。所以为了在回滚的情况下保存旧数据,我不能覆盖现有文档,而是需要添加一个新文档并用事务ID标记它:
解决方案1:
准备阶段:
- 使用更新的字段将新文档插入主集合,并用当前事务 ID 标记它。
- 在提交之前将旧文档标记为已删除,并用当前事务 ID 标记它。
提交阶段:
- 从添加的(更新的)文档中删除事务 ID。
- 删除旧文档(标记为已删除)
问题:准备阶段的第 1 部分将失败,因为我正在添加另一个具有相同唯一 ID 的文档(尽管它只是为了交易,但它仍然会失败)。
解决方案2:
准备阶段:
- 将新文档插入到具有更新字段的临时集合中,并用当前事务 ID 标记它。
- 将主集合中的旧文档标记为已删除,直到提交并使用当前事务 ID 标记它。
提交阶段:
- 将新文档从临时集合移动到主集合。
- 从主集合中删除旧文档(标记为已删除)。
问题:如果在将文档从临时集合移动到主集合时存在唯一键冲突,则提交阶段第 1 部分可能会失败。
但是,我不能允许在提交阶段发生此错误,因为为时已晚,我希望唯一键约束在准备阶段失败。
那么实施 2 阶段提交机制并避免这些问题的正确方法是什么?
c# - 具有 2 阶段提交的分布式事务 - 由于提交阶段不同步导致的原子性问题
我有一个 WCF 服务,其中包括一个标有OperationBehavior(TransactionScopeRequired=true)
和的操作TransactionFlow(TransactionFlowOption.Allowed)
。
该服务的客户端也是事务的一部分(它也有一个数据库。这是一个简化的示例),因此这涉及分布式事务和 2-phase-commit。
为了让我的数据库操作支持两阶段提交,我实现了 IEnlistmentNotification 接口。
在准备阶段,我将数据写入带有事务标签的数据库,在提交阶段,我从数据中删除事务标签。请注意,提交阶段包括数据库访问,因此可能会有点慢。
问题是,从看起来和我读到的内容来看,提交阶段是异步运行的,例如,以下顺序场景可能不起作用:
1)事务1:客户端插入A
2)事务2:客户端插入依赖于A的B(服务器查找A,从中提取信息并使用它插入B)
由于事务 1 的提交阶段可能尚未在服务器端完成,事务 2 可能找不到 A(因为它仍被标记为“事务 1”标签)。
这两个事务可能很快一个接一个地发生,所以这是一个竞争条件的问题。
我注意到它的方式是当我启用我的数据库驱动程序的日志记录时,提交变得有点慢,并且在第二个事务上发生了错误。如果我禁用了日志记录,那么它就成功了。但即使我禁用日志记录,这仍然是一个竞争条件问题,我不会在生产环境中依赖它。
解决这个问题的最佳方法是什么?
spring-boot - 如何集成jpa存储库方法的操作,即保存到xa资源事务中?
我想让 jpa 的 crud 存储库执行的操作作为 xa 事务的一部分,即它们应该在提交 xa 资源时提交。
以下是 save 方法使用 xa 资源和 saveTeam 方法使用 crud 存储库方法即 save 的代码。我尝试过支持事务传播,not_supported 等参数,但没有奏效
我想在提交 xresource 时查看 saveTeam 方法所做的更改。当前在 save Team 方法中执行 save 方法时,更改在 db 中可见。
java - Spring boot+ 2 阶段 commit+ atomikos 未启动
错误日志粘贴在下面:
我遇到了问题,但不知道如何解决这个问题,下面是 atomikos 中 Configuration.java 中的代码片段,下面的方法 notifyBeforeInit 抛出错误。
p.beforeInit(configProperties.getCompletedProperties());
谁能帮我解决这个问题。
java - 带有 Spring Boot 的 Atomikos 给出 atomikos.icatch.SysException: No Assembler Service found - 请确保正确的 jar 在您的类路径中
我正在尝试将 Atomikos 与 Spring Boot 一起使用来尝试跨两个数据库的分布式事务。我已遵循文档,但无论我做什么,我都会收到以下错误:
com.atomikos.icatch.SysException: No Assembler Service found - please make sure that the right jars are in your class path
我在 maven 中引用了 spring-boot-starter-jta-atomikos,然后尝试使用 UserTransactionManagerImp 作为记录。我什至尝试使用 UserTransactionManager,init() 它然后将它分配给 TransactionManager。但这些变化都没有奏效。它总是在 UserTransactionManager 行上失败并出现上述错误。有人可以告诉我我在做什么配置错误吗?
java - 跨多个微服务的 2PC 分布式事务?
我阅读了一些关于2 Phase Commit/XA 分布式事务以及 JTA 如何支持它的信息。似乎有许多资源管理器 - RM(例如 RDBMS 或 JMS),以及一个跨多个 RM 管理全局事务的TransactionManager (TM)实例。
我知道最好使用Saga 模式,但想想还是很有趣:
- 2PC/XA 分布式事务是否可以仅通过一个应用程序和一个 TM 与多个 RM 进行事务?
- 如果没有 -如果每个微服务只能访问自己的数据库,如何在许多微服务之间使用 2PC/XA 分布式事务来提供使用 2PC 的能力?我很高兴看到一个例子
- 我们是否需要将TransactionManager服务作为一个单独的微服务来提供多个微服务之间的 2PC?
UPD: 在 JTA 世界 TransactionManager
中,不提供 REST API来管理跨微服务的事务。LIXA 提供了这种能力。除了答案之外还有示例的文章:)
c# - 如果其中一个 API 调用在事务中调用的 API 序列中失败,如何处理错误并恢复事务状态
我有以下类型的第 3 方 API 要在 c# 代码中按顺序调用。
我应该如何在 Azure 函数 http 触发器中处理这个问题?SAGA 或 2 阶段提交是否适合这里?Azure 持久功能是否合适?我可以为此使用任何其他模式吗?