大多数流行的NoSQL数据库(MongoDB,RethinkDB)不支持ACID事务。今天,它们在不同系统的开发人员中非常流行。
问题是:如何保证没有事务的数据一致性?我认为数据一致性是生产中的主要问题之一。我说错了吗?也许有一些技术来恢复数据的一致性?
我想在我的项目中使用RethinkDB,但我害怕错过的事务。
发布于 2015-09-16 09:12:48
我对RethinkDB不太了解,所以这个答案主要是基于MongoDB的。
发布于 2016-03-04 17:48:19
许多流行的NoSQL数据存储不支持框的原子多键更新( transactions ),但其中大多数提供了原语,允许您在应用程序级别上构建ACID事务。
如果数据存储支持每个键的线性化,并支持比较和设置操作(原子文档更新),那么就足以实现可序列化的客户端事务。例如,这种方法在谷歌的Percolator和CockroachDB数据库中使用。
在我的博客中,我创建了可序列化的跨碎片客户端事务的逐步可视化,描述了主要的用例,并提供了算法变体的链接。我希望它能帮助您理解如何使用NoSQL数据存储处理事务。
支持每个密钥线性化和CAS的数据存储包括:
顺便说一句,如果您对Read提交的隔离级别很满意,那么看看Peter的斜坡交易是有意义的。它们也可以用同一组原语来实现。
发布于 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
无论如何,你没有好的交易,但你有一些基本的保证,这对你来说已经足够了。试着围绕着那些基本的东西来设计你的操作。
https://stackoverflow.com/questions/32602178
复制相似问题