3

我需要在一个事务中更新 2 个表。

在当前版本中,RethinkDB 不支持开箱即用的事务。那么,我该如何实现呢?

我可以通过两种方式进行更新:

  1. 更新第一张桌子。如果成功-> 更新第二个表。
  2. 异步更新第二个表。

但是,当 2 次更新中的 1 次成功完成,但另一个没有时,我该如何解决?是的,如果发生错误,我可以检查更新结果并恢复更新。但无论如何,当应用程序发生某些事情(失去与 Rethink 的连接,或者只是脚本崩溃)时,可能存在这样的情况,但两个更新之一已完成。因此,我的数据库将处于不一致状态。而且没有办法解决这个问题。

那么,是否可以在 nodejs 中为 RethinkDB 模拟事务行为?

4

3 回答 3

5

你能做的最好的就是两阶段提交。(MongoDB 有一个关于如何做到这一点的好文档,并且完全相同的技术应该在 RethinkDB 中工作:http://docs.mongodb.org/master/tutorial/perform-two-phase-commits/

于 2015-09-08T17:24:44.590 回答
3

RethinkDB 支持每个键的线性化和比较和设置(文档级别的原子性),众所周知,它足以实现应用程序级别的事务,而且您有多种选项可供选择:

  1. 如果您需要 Serializable 隔离级别,那么您可以遵循 Google 用于Percolator系统或 Cockroach Labs 用于CockroachDB的相同算法。我已经写了一篇关于它的博客并创建了一步一步的可视化,我希望它能帮助你理解算法背后的主要思想。

  2. 如果您预计会出现高争用,但您可以拥有已提交读隔离级别,那么请查看 Peter Bailis 的RAMP 事务

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

于 2016-03-05T07:08:14.920 回答
2

我们对在 ReThinkDB 中实现事务支持有类似的要求,因为我们希望事务能够跨越 MySQL 和 ReThinkDB 数据库边界。我们提出了这个微型库 thinktrans https://github.com/jaladankisuresh/thinktrans,这是一个基于承诺的声明性 JavaScript 库,用于支持原子事务的 RethinkDB。但是,它仍处于 alpha 阶段

如果您有特定要求,并且您可能想了解其在 NoSQL 数据库中实现事务的方法并实现您自己的方法。

免责声明:我是这个库的作者

于 2016-12-06T10:18:51.907 回答