【问题标题】:How to live without transactions?没有交易如何生活?
【发布时间】:2015-09-16 07:23:17
【问题描述】:

大多数流行的 NoSQL 数据库(MongoDB、RethinkDB)不支持 ACID 事务。它们今天在不同系统的开发人员中非常流行。

问题是:如何在没有事务的情况下保证数据的一致性? 我认为数据一致性是生产中的主要内容之一。我错了吗? 也许有一些技术可以恢复数据一致性?

我想在我的项目中使用 RethinkDB,但我担心错过交易。

【问题讨论】:

    标签: mongodb transactions rethinkdb database nosql


    【解决方案1】:

    我对RethinkDB了解不多,所以这个回答主要是基于MongoDB的。

    1. 虽然 MongoDB 不能同时对多个文档提供原子操作,但它确实保证了影响一个文档的单个操作的原子性。这意味着当一个查询更改同一文档的多个字段时,您可以确保所有这些更改将同时执行。结合 MongoDB 的理念,即在一个文档中保持一致的数据集,而不是将其分布在多行不同的相关表中,这消除了许多需要在关系数据库中进行事务处理的情况。

    2. 不是每个项目都需要复杂的交易。当然,在某些领域它是必不可少的(就像您处理金钱的大多数情况一样),但在其他情况下,当某些数据在几毫秒内不一致时,这实际上并不是什么大问题。您需要考虑数据一致性对您的项目有多重要。当您得出在很多情况下确实需要事务的结论时,请务必坚持使用 SQL。

    3. 在紧要关头,MongoDB 可以使用the two-phase commit model 模拟多文档事务。实现起来不容易,使用起来也不容易,它不会产生漂亮的数据模型,但是当你有一个项目时,它是一个有效的解决方法,除了那个用例之外,它在所有方面都非常适合 MongoDB这离不开交易。

    【讨论】:

      【解决方案2】:

      许多流行的 NoSQL 数据存储不支持盒子的原子多键更新(事务),但它们中的大多数都提供允许您在应用程序级别构建 ACID 事务的原语。

      如果数据存储支持每个键的线性化和比较和设置操作(原子文档更新),那么实现可序列化的客户端事务就足够了。例如,Google's PercolatorCockroachDB 数据库中使用了这种方法。

      在我的博客中,我创建了step-by-step visualization of serializable cross shard client-side transactions,描述了主要用例并提供了算法变体的链接。我希望它能帮助您了解如何使用 NoSQL 数据存储处理事务。

      支持每个键线性化和 CAS 的数据存储包括:

      • 具有轻量级事务的 Cassandra
      • 具有一致存储桶的 Riak
      • 重新思考数据库
      • 动物园管理员
      • Etdc
      • HBase
      • DynamoDB
      • MongoDB

      顺便说一句,如果您对 Read Committed 隔离级别没问题,那么看看 Peter Bailis 的 RAMP transactions 是有意义的。它们也可以使用相同的原语集来实现。

      【讨论】:

        【解决方案3】:

        在 RethinkDB 中,您对原子性有一些保证。根据文档https://rethinkdb.com/docs/architecture/

        在每个文档的基础上支持写入原子性 - 更新到 单个 JSON 文档保证是原子的。 RethinkDB 是 在原子文档更新方面与其他 NoSQL 系统不同 不限于一小部分可能的操作——任何 可以对单个文档执行的操作的组合 保证自动更新文档

        根据https://www.rethinkdb.com/api/javascript/update/,当您想要运行非原子更新时,您必须明确选择加入

        nonAtomic:如果设置为 true,则执行更新并分发 结果以非原子方式复制。这个标志是必需的 执行非确定性更新,例如那些需要阅读的更新 另一个表中的数据。

        在此处跟踪对 RethinkDB 的某些事务支持存在问题:https://github.com/rethinkdb/rethinkdb/issues/4598

        不管怎样,你没有好的交易,但你有一些基本的保证对你来说已经足够了。并尝试围绕这些基本事物设计您的操作。

        【讨论】:

        • 啊,对不起,我忘了提到我的问题与多个实体的更新有关。例如在关系的情况下。
        猜你喜欢
        • 2015-08-27
        • 2016-01-12
        • 2019-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-22
        • 1970-01-01
        • 2012-02-04
        相关资源
        最近更新 更多