【问题标题】:How to manage transactions over multiple databases如何管理跨多个数据库的事务
【发布时间】:2016-07-21 07:48:16
【问题描述】:

我有一个 Web 应用程序,它接收将订单保存在数据库中的请求。我想写入 2 个不同的数据库——一个 Cassandra 实例和一个 PostgreSQL 实例。我使用的是纯 Java 和 JDBC(带有 apache DBUtis),前面有一个轻量级 Web 应用程序库。

我不确定的是如何跨两个数据库实现事务性,即如果对其中一个数据库的写入失败,则回滚另一个写入并将错误消息放入错误日志中。

Java 中是否有任何机制来实现这一点?我知道诸如两阶段提交之类的事情,这就是我要在这里寻找的吗?有其他选择吗?

【问题讨论】:

  • 请看here,它建议不要这样做。您能否更新您的问题,让我们知道您打算如何使用这两个数据库?
  • 我没有标记它,因为我们可能会发现他不需要在一个事务中写入两个数据库。或许找到他的业务逻辑的替代方案可以避免两个数据库事务。
  • 我同意蒂姆的观点,这是一个坏主意,除非两个写入彼此不相关,或者不会/不能相互影响,或者不会丢失一些关键的东西。跨度>
  • 这个概念叫做two phase commit。 Postgres 支持这个postgresql.org/docs/current/static/sql-prepare-transaction.html。不了解 Cassandra

标签: java postgresql distributed-transactions


【解决方案1】:

Cassandra 和 PostgreSQL 都支持线性化和比较设置 (CAS),因此您可以在客户端实现事务。

如果您想要 Serializable Isolation 级别,那么您应该查看Percolator's transactions。 Percolator 的交易在业内非常知名,并已在亚马逊的DynamoDB transaction libraryCockroachDB database 和谷歌的 Pecolator 系统本身中使用。 Percolator 交易的step-by-step visualization 可能会帮助您理解它。

如果您预计会出现争用并且可以处理已提交的读隔离级别,那么 Peter Bailis 的 RAMP transactions 可能适合您。我还创建了一个step-by-step RAMP visualization

第三种方法是使用补偿事务,也称为 saga 模式。它在 80 年代后期的 Sagas 论文中有所描述,但随着分布式系统的兴起而变得更加实际。请参阅Applying the Saga Pattern 谈话以获取灵感。

【讨论】:

  • Original Percolator 仅提供不可序列化的快照隔离。尽管它的行为类似于经典的 2PL,但它不会在读取上加锁(从这个意义上说,它属于悲观混合 CC 算法)。可以通过某种方式对其进行更改以提供可序列化性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-02
  • 2014-04-26
  • 2010-12-02
  • 1970-01-01
相关资源
最近更新 更多