没有交易如何生活?

时间:2015-09-16 07:23:18

标签: mongodb transactions rethinkdb database nosql

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

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

我现在想在我的项目中使用RethinkDB,但我对未完成的交易感到害怕。

3 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

A lot of popular NoSQL data stores don't support atomic multi-key updates (transactions) of the box but most of them provide primitives which allow you to build ACID transactions on the application level.

If a data store supports per key linearizability and compare-and-set operation (atomic document updates) then it's enough to implement serializable client-side transactions. For example, this approach is used in Google's Percolator and in CockroachDB database.

In my blog I created step-by-step visualization of serializable cross shard client-side transactions, described the major use cases and provided links to the variants of the algorithm. I hope it will help you to understand how to work with transactions with NoSQL data stores.

Among the data stores which support per key linearizability and CAS are:

  • Cassandra with lightweight transactions
  • Riak with consistent buckets
  • RethinkDB
  • ZooKeeper
  • Etdc
  • HBase
  • DynamoDB
  • MongoDB

By the way, if you're fine with Read Committed isolation level then it makes sense to take a look on RAMP transactions by Peter Bailis. They can be also implemented with the same set of primitives.

答案 2 :(得分:0)

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

  

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

根据https://www.rethinkdb.com/api/javascript/update/

,如果要运行非原子更新,则必须明确选择加入它。
  

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

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

无论如何,你没有良好的交易,但你有一些足够的基本保证。并尝试围绕这些基本事物设计您的操作。