首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在没有交易的情况下生活?

如何在没有交易的情况下生活?
EN

Stack Overflow用户
提问于 2015-09-16 07:23:17
回答 3查看 2.3K关注 0票数 5

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

问题是:如何保证没有事务的数据一致性?我认为数据一致性是生产中的主要问题之一。我说错了吗?也许有一些技术来恢复数据的一致性?

我想在我的项目中使用RethinkDB,但我害怕错过的事务。

EN

回答 3

Stack Overflow用户

发布于 2015-09-16 09:12:48

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

  1. 虽然MongoDB不能同时对多个文档提供原子操作,但它确实保证了影响一个文档的单个操作的原子性。这意味着,当一个查询更改同一文档的多个字段时,可以确保所有这些更改都将同时执行。结合MongoDB哲学,即在一个文档中保持一个一致的数据集,而不是将其分散到多行不同的相关表中,这就消除了需要关系数据库中的事务的许多情况。
  2. 并不是每个项目都需要复杂的事务。当然,有些领域是必不可少的(就像大多数情况下你处理金钱),但在其他情况下,当一些数据在几毫秒内不一致时,实际上并不是什么大不了的事情。您需要考虑数据一致性对于项目的重要性。当您得出结论,有许多情况下您确实需要事务,那么无论如何,坚持SQL。
  3. 在紧急情况下,MongoDB可以使用两阶段提交模型模拟多文档事务。它不容易实现,使用起来也不容易,它不会产生一个漂亮的数据模型,但是当您有一个在所有方面都适合MongoDB的项目时,它是一个有效的解决方案,除了那个用例之外,它不能没有事务。
票数 2
EN

Stack Overflow用户

发布于 2016-03-04 17:48:19

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

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

在我的博客中,我创建了可序列化的跨碎片客户端事务的逐步可视化,描述了主要的用例,并提供了算法变体的链接。我希望它能帮助您理解如何使用NoSQL数据存储处理事务。

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

  • 具有轻量级事务的Cassandra
  • 有一致桶的Riak
  • RethinkDB
  • ZooKeeper
  • 特德
  • HBase
  • DynamoDB
  • MongoDB

顺便说一句,如果您对Read提交的隔离级别很满意,那么看看Peter的斜坡交易是有意义的。它们也可以用同一组原语来实现。

票数 1
EN

Stack Overflow用户

发布于 2015-09-16 17:04:19

在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

无论如何,你没有好的交易,但你有一些基本的保证,这对你来说已经足够了。试着围绕着那些基本的东西来设计你的操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32602178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档