database - 分布式事务的惯用语或算法?

标签 database distributed distributed-transactions

假设您在不同的系统上有 2 个实体,并且需要执行某种事务,根据与其中一个或两个实体关联的信息来更改其中一个或两个实体,并要求对两个实体的更改要么完成,要么都不完成他们中的一些人会。

简单的示例,本质上必须在 2 个独立的硬件上运行 2 条线路:

my_bank.my_account -= payment
their_bank.their_account += payment

大概有专门针对这种情况存在的算法或习惯用法,在存在其他尝试访问相同值的情况下正常工作(对于正确的某些可预测的定义)。 two-phase commit protocol似乎就是这样一种方法。是否有更简单的替代方案,也许有更多的限制? (例如,也许他们要求任何系统都不能完全关闭或无法响应。)或者也许有更复杂的系统在某些方面更好?关于此事是否有标准或备受推崇的文本?

最佳答案

还有 3PC“3 Phase Commit Protocol”。 3PC 通过一个称为预提交的额外阶段解决了 2PC 的一些问题。事务中的参与者收到预提交消息,知道所有其他参与者已同意提交,但尚未完成。当所有参与者都在等待来自协调器的提交或中止消息时,此阶段消除了 2PC 的不确定性。

据我所知 - 大多数数据库都可以很好地使用 2PC 协议(protocol),因为在不太可能出现故障的情况下,它们始终具有事务日志来撤消/重做操作并使数据保持一致状态。

大部分内容都在

中得到了很好的讨论

"Database Solutions, second edition"

"Database Systems: The Complete Book"

在分布式世界中,您可能希望在 distributed transactions and workflows 上检查 Web 服务技术的当前状态。 。老实说,不是我喜欢的。 Python、Java 和 .Net 都有框架来运行此类服务 ( an example )。

作为我去年的项目,几年前,我在 Web 服务之上实现了分布式 2PC 协议(protocol),并且能够在两个单独的数据库上运行事务,就像您给出的示例一样。然而,我确信今天人们以一种最安静的方式来实现这一点,例如 see here 。尽管这些链接中提到了一些其他协议(protocol),但最终它们都实现了 2PC。

总而言之,具有适当的操作日志以在崩溃时撤消/重做的 2PC 协议(protocol)实现是最明智的选择之一。

关于database - 分布式事务的惯用语或算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5386510/

相关文章:

php - 使用 PHP 添加新的 mySQL 表行不起作用

transactions - SSIS TransactionOption Required 导致错误(全部在本地机器上)

domain-driven-design - 事件溯源和传奇 - 补偿交易

database - 使用 DBIx::Class 在 SQLite 数据库上创建索引

html - 大型 HTML 表格到本地数据库

Java:连接到数据库以获取数据

hibernate - 使用 Bitronix Transcation Manager 时将 Hibernate after_transaction 设置为 JTA 连接 Release模式是否安全?

concurrency - 编写可伸缩代码

java - 分布式微服务共享状态

distributed - 在 Apache Kafka 中,为什么消费者实例不能多于分区?