我需要在一个事务中更新2个表。
在当前版本中,RethinkDB不支持从框中进行交易。那么,我怎样才能做到这一点?
我可以通过两种方式进行更新:
但是,当2个更新中的1个完成时,我怎么能解决案例,但是另一个没有?是的,如果发生错误,我可以查看更新结果并恢复更新。但无论如何,可能有这种情况,当应用程序发生某些事情时(丢失与Rethink的连接,或者只是脚本崩溃),但两个更新中的一个已完成。 所以,我的数据库将处于不一致状态。无法解决这个问题。
那么,是否可以在RethinkDB中模拟nodejs中的事务行为?
答案 0 :(得分:3)
您可以做的最好的事情是两阶段提交。 (MongoDB有一个关于如何做到这一点的好文档,完全相同的技术应该在RethinkDB中起作用:http://docs.mongodb.org/master/tutorial/perform-two-phase-commits/。)
答案 1 :(得分:1)
RethinkDB支持每个键的线性化和比较和设置(文档级原子性),并且已知它足以实现应用程序级别的事务,您可以选择多个选项:
如果您需要Serializable隔离级别,那么您可以使用Google用于Percolator系统或Cockroach Labs CockroachDB的相同算法。我已经在博客上发表了关于它并创建了step-by-step visualization,我希望它能帮助您理解算法背后的主要思想。
如果您希望获得较高的争用但是您可以获得Read Committed隔离级别,那么请查看Peter Bailis的RAMP transactions。
第三种方法是使用补偿交易,也称为传奇模式。它在80年代晚期的Sagas论文中有所描述,但随着分布式系统的发展变得越来越实际。请参阅Applying the Saga Pattern对话获取灵感。
答案 2 :(得分:1)
我们有类似的要求在ReThinkDB中实现事务支持,因为我们希望事务跨MySQL和ReThinkDB DB边界扩展。我们已经提出了这个微库thinktrans https://github.com/jaladankisuresh/thinktrans,这是一个基于承诺的RethinkDB支持Atomic事务的声明性javascript库。但是,它仍处于alpha阶段
如果您有特定要求,并且您可能希望了解其方法Implementing Transactions in NoSQL Databases并实施自己的方法。
免责声明:我是这个图书馆的作者