是否有符合ACID的NoSQL数据存储?
虽然它只是一个嵌入式引擎而不是服务器,但leveldb具有WriteBatch并能够打开同步写入以提供ACID行为 .
节点级别UP是事务性的并且构建在leveldb上https://github.com/rvagg/node-levelup#batch
Google Cloud Datastore is a NoSQL database that supports ACID transactions
DynamoDB是一个NoSQL数据库,并且ACID transactions .
NoSQL的祖父:ZODB符合ACID标准 . http://www.zodb.org/
但是,它只是Python .
不仅NoSQL不符合ACID设计 . NoSQL运动拥抱BASE(基本可用,软状态,最终一致性)声称与ACID相反 . NoSQL数据库通常称为最终一致的数据库 . 要理解差异,你应深入研究CAP定理(又名布鲁尔定理)
访问http://www.julianbrowne.com/article/viewer/brewers-cap-theorem
VoltDB是一个声称符合ACID标准的参赛者,虽然它仍然使用SQL,但它在可扩展性方面的目标是相同的
我会发布这个答案纯粹是为了支持对话 - Tim Mahy,nawroth和CraigTP建议了可行的数据库 . 由于使用Erlang,CouchDB将是我的首选,但还有其他人 .
我会说 ACID 并不反驳或否定 NoSQL 的概念......虽然似乎有一种趋势遵循dove所表达的观点,但我认为这些概念是截然不同的 .
NoSQL 基本上是关于简单键值(例如Redis)或文档样式模式("document"模型中收集的键值对,例如MongoDB),作为经典RDBMS中显式模式的直接替代 . 它允许开发人员不对称地处理事物,而传统引擎在数据模型中强制执行严格的相同性 . 之所以如此有趣,是因为它提供了一种处理变更的不同方式,而对于更大的数据集,它提供了处理数量和性能的有趣机会 .
ACID 提供了有关如何将更改应用于数据库的原则 . 以非常简单的方式,它表明(我自己的版本):
(A)当您执行某些操作来更改数据库时,更改应该作为一个整体工作或失败
(C)数据库应保持一致(这是一个相当广泛的主题)
(I)如果其他事情同时发生,他们应该无法在更新中看到事情
(D)如果系统爆炸(硬件或软件),数据库需要能够自行备份;如果它说它已完成应用更新,则需要确定
当涉及propagation and constraints的想法时,谈话会变得更加兴奋 . 一些RDBMS引擎提供了强制执行约束(例如,外键)的能力,其可以具有传播元素(级联) . 简单来说,一个"thing"可能与数据库中的另一个"thing"有关系,如果你更改一个属性,它可能需要另一个被更改(更新,删除,......许多选项) . 主要(目前)专注于高数据量和高流量的数据库似乎正在解决在(从消费者的角度来看)任意时间框架内发生的分布式更新的想法 . 这基本上是replication通过transaction管理的一种特殊形式 - 所以我想说如果传统的分布式数据库可以支持ACID,那么NoSQL数据库也是如此 .
一些资源供进一步阅读:
Wikipedia article on ACID
Wikipedia on propagation constraints
Wikipedia (yeah, I like the site, ok?) on database normalization
Apache documentation on CouchDB with a good overview of how it applies ACID
Wikipedia on集群计算
Wikipedia (again...) on database transactions
UPDATE (27 July 2012): 维基百科文章的链接已更新,以反映此答案发布时当前文章的版本 . 请注意current Wikipedia article已经过广泛修改!
好吧,根据Wikipedia article on NoSQL的旧版本:
NoSQL是一种推动松散定义的非关系数据存储类的运动,它打破了关系数据库和ACID保证的悠久历史 .
并且:
该名称试图描述越来越多的非关系型分布式数据存储的出现,这些数据存储通常不会尝试提供ACID保证 .
和
NoSQL系统通常提供弱一致性保证,例如最终一致性和仅限于单个数据项的事务,即使可以通过添加补充中间件层来强加完整的ACID保证 .
因此,简而言之,我会说"NoSQL"数据存储的主要好处之一是它明显缺乏ACID属性 . 此外,恕我直言,越是试图实现和实施ACID属性,越远离你得到的"NoSQL"数据存储,越接近"true" RDBMS(当然,相对来说) .
然而,所有这一切,"NoSQL"是一个非常模糊的术语,并且对个人的解释持开放态度,并且在很大程度上取决于你有多少纯粹主义观点 . 例如,大多数现代RDBMS系统实际上并不遵守relation model的所有12 rules!
采取务实的方法,似乎Apache的CouchDB最接近体现ACID兼容性,同时保留松散耦合,非关系性的心态 .
FoundationDB是符合ACID:
http://www.foundationdb.com/
它具有正确的事务,因此您可以以ACID方式更新多个不同的数据项 . 这用作在更高层维护索引的基础 .
在这个问题中,有人必须提到OrientDB:OrientDB是一个NoSQL数据库,是少数几个支持完全ACID事务的数据库之一 . ACID不仅适用于RDBMS,因为它不是Relational代数的一部分 . 因此可以使用支持ACID的NoSQL数据库 .
这个功能是我在MongoDB中最想念的功能
请确保you read the Martin Fowler introduction about NoSQL databases . 和相应的视频 .
首先,我们可以区分两种类型的NoSQL数据库:
面向聚合的数据库;
面向图形的数据库(例如Neo4J) .
按照设计,大多数面向图形的数据库都是ACID!
那么,其他类型呢?
在面向聚合的数据库中,我们可以放置三个子类型:
基于文档的NoSQL数据库(例如MongoDB,CouchDB);
Key / Value NoSQL数据库(例如Redis);
列族NoSQL数据库(例如Hibase,Cassandra) .
我们称之为Aggregate的是Eric Evans在其_2513491中定义为给定有界上下文中的实体和值对象的自给自足 .
因此,聚合是我们作为一个单元进行交互的数据集合 . 聚合形成了数据库的ACID操作的边界 . (马丁福勒)
因此,在Aggregate级别,我们可以说大多数NoSQL数据库可以像ACID RDBMS一样安全,具有适当的设置 . 从来看,如果你以最佳速度调整服务器,你可能会遇到非ACID的问题 . 但复制会有所帮助 .
我的主要观点是你必须使用NoSQL数据库,而不是RDBMS的(廉价)替代品 . 我看到太多项目滥用文件之间的关系 . 这不能是ACID . 如果您保持文档级别,即在Aggregate边界,则不需要任何事务 . 并且您的数据将与ACID数据库一样安全,即使它不是真正的ACID,因为您不需要这些交易!如果您需要事务并一次更新多个“文档”,那么您不再是NoSQL世界 - 所以请改用RDBMS引擎!
ACID和NoSQL是完全正交的 . 一个并不意味着另一个 .
我的 table 上有一个笔记本,我用它来记录我仍然需要做的事情 . 这个笔记本是一个NoSQL数据库 . 我使用带有“页面缓存”的线性搜索来查询它,所以我不必总是搜索每一页 . 它也符合ACID标准,因为我确保我一次只写一件事,而不是在我读它的时候 .
NoSQL只是意味着它不是't SQL. Many people get confused and think it means highly-scaleable-wild-west-super-fast-storage. It doesn' t . 它并不意味着键值存储或最终的一致性 . 它的意思是"not SQL",这个星球上有很多数据库,其中大部分都不是SQL [需要引证] .
您可以在其他答案中找到许多示例,因此我不需要在此处列出它们,但是对于各种操作,存在具有ACID合规性的非SQL数据库,一些仅针对单个对象写入的ACID,而一些保证更多 . 每个数据库都不同 .
“NoSQL”并不是一个定义明确的术语 . 这是一个非常模糊的概念 . 因此,甚至不可能说什么是什么,什么不是“NoSQL”产品 . 几乎所有标有品牌标签的产品都不是键值商店 .
是的,MarkLogic Server是一个NoSQL解决方案(我喜欢称之为文档数据库),它适用于ACID事务
如果您正在寻找符合ACID标准的键/值存储,那么Berkeley DB . 在graph databases中,至少Neo4j和HyperGraphDB提供ACID事务(HyperGraphDB目前实际上使用Berkeley DB进行低级别存储) .
作为NoSQL的创始人之一(我是Apache CouchDB的早期撰稿人,以及2009年在CBS Interactive / CNET举办的the first NoSQL event的演讲者),我之前就已经存在了 . The Calvin protocol提供了一种思考CAP和PACELC等物理约束的新方法 .
Calvin不使用主动/被动异步复制或主动/主动同步复制,而是使用RAFT-like protocol来维护事务日志,从而在副本中断期间保留正确性和可用性 . 此外,每个副本都有transactions are processed deterministically,消除了死锁的可能性,因此只需达到一轮共识即可达成协议 . 这使得它甚至在多 Cloud 上也很快全球部署 .
FaunaDB是使用Calvin协议的唯一数据库实现,使其特别适用于需要具有NoSQL规模和灵活性的类似大型机的数据完整性的工作负载 .
MongoDB宣布其4.0版本将符合ACID标准,适用于多文档交易 .
版本4.2 . 应该在分片设置下支持它 .
https://www.mongodb.com/blog/post/multi-document-transactions-in-mongodb
看看CAP定理
编辑:RavenDB似乎符合ACID
要添加到备选列表中,另一个完全符合ACID标准的NoSQL数据库是GT.M .
Hyperdex Warp http://hyperdex.org/warp/ Warp(ACID功能)是专有的,但Hyperdex是免费的 .
这个概念Wikipedia contributors定义为:
[...]一类现代关系数据库管理系统,旨在为在线事务处理(OLTP)读写工作负载提供相同的NoSQL系统可扩展性能,同时仍保持传统数据库系统的ACID保证 . [1] [ 2] [3]
[1] Nancy Lynch和Seth Gilbert,“Brewer's conjecture and the feasibility of consistent, available, partition-tolerant web services”,ACM SIGACT News,第33卷第2期(2002年),第7页 . 51-59 .
[1]
[2] "Brewer's CAP Theorem",julianbrowne.com,检索2010年3月2日
[2]
[3] "Brewers CAP theorem on distributed systems",royans.net
[3]
有人提到了FoundationDB,当时它还没有被Apple开源:https://www.foundationdb.org/blog/foundationdb-is-open-source/
我相信它符合ACID标准 .
db4o
与roll-your-own持久性或序列化不同,db4o是ACID事务安全的,并允许在运行时进行查询,复制和模式更改
http://www.db4o.com/about/productinformation/db4o/
Tarantool是一个完全ACID NoSQL数据库 . 您可以发出CRUD操作或存储过程,一切都将严格按照ACID属性运行 . 你也可以在这里阅读:http://stable.tarantool.org/doc/mpage/data-and-persistence.html
等待结束了 .
符合ACID标准的NoSQL DB出来-----------看看citrusleaf
BergDB是一个轻量级,开源的NoSQL数据库,从一开始就设计运行ACID事务 . 实际上,BergDB比大多数SQL数据库更具有ACID,因为改变数据库状态的唯一方法是运行具有最高隔离级别的ACID事务(SQL术语:"serializable") . 脏读,不可重复读或幻像读不会有任何问题 .
在我看来,数据库仍然具有很高的性能;但是不要相信我,我创造了这个软件 . 请自己尝试一下 .
许多现代NoSQL解决方案不支持ACID事务(原子隔离多键更新),但大多数都支持允许您在应用程序级别实现事务的原语 .
如果数据存储支持每个键的线性化和比较和设置(文档级原子性),那么它足以实现客户端事务,更多的是你有几个选项可供选择:
如果您需要Serializable隔离级别,那么您可以遵循Google用于Percolator系统的相同算法或适用于CockroachDB的Cockroach Labs . 我发表了关于它的博客并创建了一个step-by-step visualization,我希望它能帮助你理解算法背后的主要思想 .
如果您期望高争用但是您可以拥有Read Committed隔离级别,那么请查看Peter Bailis的RAMP transactions .
第三种方法是使用补偿交易,也称为传奇模式 . 它在80年代后期的论文中有所描述,但随着分布式系统的发展变得越来越实际 . 请参阅Applying the Saga Pattern谈话获取灵感 .
适用于客户端事务的数据存储列表包括具有轻量级事务的Cassandra,具有一致桶的Riak,RethinkDB,ZooKeeper,Etdc,HBase,DynamoDB,MongoDB等 .
MarkLogic也是ACID complient . 我认为现在是最大的球员之一 .
YugaByte DB支持查询图层上的ACID Compliant distributed txns以及Redis和CQL API兼容性 .
30 回答
虽然它只是一个嵌入式引擎而不是服务器,但leveldb具有WriteBatch并能够打开同步写入以提供ACID行为 .
节点级别UP是事务性的并且构建在leveldb上https://github.com/rvagg/node-levelup#batch
Google Cloud Datastore is a NoSQL database that supports ACID transactions
DynamoDB是一个NoSQL数据库,并且ACID transactions .
NoSQL的祖父:ZODB符合ACID标准 . http://www.zodb.org/
但是,它只是Python .
不仅NoSQL不符合ACID设计 . NoSQL运动拥抱BASE(基本可用,软状态,最终一致性)声称与ACID相反 . NoSQL数据库通常称为最终一致的数据库 . 要理解差异,你应深入研究CAP定理(又名布鲁尔定理)
访问http://www.julianbrowne.com/article/viewer/brewers-cap-theorem
VoltDB是一个声称符合ACID标准的参赛者,虽然它仍然使用SQL,但它在可扩展性方面的目标是相同的
我会发布这个答案纯粹是为了支持对话 - Tim Mahy,nawroth和CraigTP建议了可行的数据库 . 由于使用Erlang,CouchDB将是我的首选,但还有其他人 .
我会说 ACID 并不反驳或否定 NoSQL 的概念......虽然似乎有一种趋势遵循dove所表达的观点,但我认为这些概念是截然不同的 .
NoSQL 基本上是关于简单键值(例如Redis)或文档样式模式("document"模型中收集的键值对,例如MongoDB),作为经典RDBMS中显式模式的直接替代 . 它允许开发人员不对称地处理事物,而传统引擎在数据模型中强制执行严格的相同性 . 之所以如此有趣,是因为它提供了一种处理变更的不同方式,而对于更大的数据集,它提供了处理数量和性能的有趣机会 .
ACID 提供了有关如何将更改应用于数据库的原则 . 以非常简单的方式,它表明(我自己的版本):
(A)当您执行某些操作来更改数据库时,更改应该作为一个整体工作或失败
(C)数据库应保持一致(这是一个相当广泛的主题)
(I)如果其他事情同时发生,他们应该无法在更新中看到事情
(D)如果系统爆炸(硬件或软件),数据库需要能够自行备份;如果它说它已完成应用更新,则需要确定
当涉及propagation and constraints的想法时,谈话会变得更加兴奋 . 一些RDBMS引擎提供了强制执行约束(例如,外键)的能力,其可以具有传播元素(级联) . 简单来说,一个"thing"可能与数据库中的另一个"thing"有关系,如果你更改一个属性,它可能需要另一个被更改(更新,删除,......许多选项) . 主要(目前)专注于高数据量和高流量的数据库似乎正在解决在(从消费者的角度来看)任意时间框架内发生的分布式更新的想法 . 这基本上是replication通过transaction管理的一种特殊形式 - 所以我想说如果传统的分布式数据库可以支持ACID,那么NoSQL数据库也是如此 .
一些资源供进一步阅读:
Wikipedia article on ACID
Wikipedia on propagation constraints
Wikipedia (yeah, I like the site, ok?) on database normalization
Apache documentation on CouchDB with a good overview of how it applies ACID
Wikipedia on集群计算
Wikipedia (again...) on database transactions
UPDATE (27 July 2012): 维基百科文章的链接已更新,以反映此答案发布时当前文章的版本 . 请注意current Wikipedia article已经过广泛修改!
好吧,根据Wikipedia article on NoSQL的旧版本:
并且:
和
因此,简而言之,我会说"NoSQL"数据存储的主要好处之一是它明显缺乏ACID属性 . 此外,恕我直言,越是试图实现和实施ACID属性,越远离你得到的"NoSQL"数据存储,越接近"true" RDBMS(当然,相对来说) .
然而,所有这一切,"NoSQL"是一个非常模糊的术语,并且对个人的解释持开放态度,并且在很大程度上取决于你有多少纯粹主义观点 . 例如,大多数现代RDBMS系统实际上并不遵守relation model的所有12 rules!
采取务实的方法,似乎Apache的CouchDB最接近体现ACID兼容性,同时保留松散耦合,非关系性的心态 .
FoundationDB是符合ACID:
http://www.foundationdb.com/
它具有正确的事务,因此您可以以ACID方式更新多个不同的数据项 . 这用作在更高层维护索引的基础 .
在这个问题中,有人必须提到OrientDB:OrientDB是一个NoSQL数据库,是少数几个支持完全ACID事务的数据库之一 . ACID不仅适用于RDBMS,因为它不是Relational代数的一部分 . 因此可以使用支持ACID的NoSQL数据库 .
这个功能是我在MongoDB中最想念的功能
请确保you read the Martin Fowler introduction about NoSQL databases . 和相应的视频 .
首先,我们可以区分两种类型的NoSQL数据库:
面向聚合的数据库;
面向图形的数据库(例如Neo4J) .
按照设计,大多数面向图形的数据库都是ACID!
那么,其他类型呢?
在面向聚合的数据库中,我们可以放置三个子类型:
基于文档的NoSQL数据库(例如MongoDB,CouchDB);
Key / Value NoSQL数据库(例如Redis);
列族NoSQL数据库(例如Hibase,Cassandra) .
我们称之为Aggregate的是Eric Evans在其_2513491中定义为给定有界上下文中的实体和值对象的自给自足 .
因此,在Aggregate级别,我们可以说大多数NoSQL数据库可以像ACID RDBMS一样安全,具有适当的设置 . 从来看,如果你以最佳速度调整服务器,你可能会遇到非ACID的问题 . 但复制会有所帮助 .
我的主要观点是你必须使用NoSQL数据库,而不是RDBMS的(廉价)替代品 . 我看到太多项目滥用文件之间的关系 . 这不能是ACID . 如果您保持文档级别,即在Aggregate边界,则不需要任何事务 . 并且您的数据将与ACID数据库一样安全,即使它不是真正的ACID,因为您不需要这些交易!如果您需要事务并一次更新多个“文档”,那么您不再是NoSQL世界 - 所以请改用RDBMS引擎!
ACID和NoSQL是完全正交的 . 一个并不意味着另一个 .
我的 table 上有一个笔记本,我用它来记录我仍然需要做的事情 . 这个笔记本是一个NoSQL数据库 . 我使用带有“页面缓存”的线性搜索来查询它,所以我不必总是搜索每一页 . 它也符合ACID标准,因为我确保我一次只写一件事,而不是在我读它的时候 .
NoSQL只是意味着它不是't SQL. Many people get confused and think it means highly-scaleable-wild-west-super-fast-storage. It doesn' t . 它并不意味着键值存储或最终的一致性 . 它的意思是"not SQL",这个星球上有很多数据库,其中大部分都不是SQL [需要引证] .
您可以在其他答案中找到许多示例,因此我不需要在此处列出它们,但是对于各种操作,存在具有ACID合规性的非SQL数据库,一些仅针对单个对象写入的ACID,而一些保证更多 . 每个数据库都不同 .
“NoSQL”并不是一个定义明确的术语 . 这是一个非常模糊的概念 . 因此,甚至不可能说什么是什么,什么不是“NoSQL”产品 . 几乎所有标有品牌标签的产品都不是键值商店 .
是的,MarkLogic Server是一个NoSQL解决方案(我喜欢称之为文档数据库),它适用于ACID事务
如果您正在寻找符合ACID标准的键/值存储,那么Berkeley DB . 在graph databases中,至少Neo4j和HyperGraphDB提供ACID事务(HyperGraphDB目前实际上使用Berkeley DB进行低级别存储) .
作为NoSQL的创始人之一(我是Apache CouchDB的早期撰稿人,以及2009年在CBS Interactive / CNET举办的the first NoSQL event的演讲者),我之前就已经存在了 . The Calvin protocol提供了一种思考CAP和PACELC等物理约束的新方法 .
Calvin不使用主动/被动异步复制或主动/主动同步复制,而是使用RAFT-like protocol来维护事务日志,从而在副本中断期间保留正确性和可用性 . 此外,每个副本都有transactions are processed deterministically,消除了死锁的可能性,因此只需达到一轮共识即可达成协议 . 这使得它甚至在多 Cloud 上也很快全球部署 .
FaunaDB是使用Calvin协议的唯一数据库实现,使其特别适用于需要具有NoSQL规模和灵活性的类似大型机的数据完整性的工作负载 .
MongoDB宣布其4.0版本将符合ACID标准,适用于多文档交易 .
版本4.2 . 应该在分片设置下支持它 .
https://www.mongodb.com/blog/post/multi-document-transactions-in-mongodb
看看CAP定理
编辑:RavenDB似乎符合ACID
要添加到备选列表中,另一个完全符合ACID标准的NoSQL数据库是GT.M .
Hyperdex Warp http://hyperdex.org/warp/ Warp(ACID功能)是专有的,但Hyperdex是免费的 .
NewSQL
这个概念Wikipedia contributors定义为:
参考文献
[1]
Nancy Lynch和Seth Gilbert,“Brewer's conjecture and the feasibility of consistent, available, partition-tolerant web services”,ACM SIGACT News,第33卷第2期(2002年),第7页 . 51-59 .[2]
"Brewer's CAP Theorem",julianbrowne.com,检索2010年3月2日[3]
"Brewers CAP theorem on distributed systems",royans.net有人提到了FoundationDB,当时它还没有被Apple开源:https://www.foundationdb.org/blog/foundationdb-is-open-source/
我相信它符合ACID标准 .
db4o
http://www.db4o.com/about/productinformation/db4o/
Tarantool是一个完全ACID NoSQL数据库 . 您可以发出CRUD操作或存储过程,一切都将严格按照ACID属性运行 . 你也可以在这里阅读:http://stable.tarantool.org/doc/mpage/data-and-persistence.html
等待结束了 .
符合ACID标准的NoSQL DB出来-----------看看citrusleaf
BergDB是一个轻量级,开源的NoSQL数据库,从一开始就设计运行ACID事务 . 实际上,BergDB比大多数SQL数据库更具有ACID,因为改变数据库状态的唯一方法是运行具有最高隔离级别的ACID事务(SQL术语:"serializable") . 脏读,不可重复读或幻像读不会有任何问题 .
在我看来,数据库仍然具有很高的性能;但是不要相信我,我创造了这个软件 . 请自己尝试一下 .
许多现代NoSQL解决方案不支持ACID事务(原子隔离多键更新),但大多数都支持允许您在应用程序级别实现事务的原语 .
如果数据存储支持每个键的线性化和比较和设置(文档级原子性),那么它足以实现客户端事务,更多的是你有几个选项可供选择:
如果您需要Serializable隔离级别,那么您可以遵循Google用于Percolator系统的相同算法或适用于CockroachDB的Cockroach Labs . 我发表了关于它的博客并创建了一个step-by-step visualization,我希望它能帮助你理解算法背后的主要思想 .
如果您期望高争用但是您可以拥有Read Committed隔离级别,那么请查看Peter Bailis的RAMP transactions .
第三种方法是使用补偿交易,也称为传奇模式 . 它在80年代后期的论文中有所描述,但随着分布式系统的发展变得越来越实际 . 请参阅Applying the Saga Pattern谈话获取灵感 .
适用于客户端事务的数据存储列表包括具有轻量级事务的Cassandra,具有一致桶的Riak,RethinkDB,ZooKeeper,Etdc,HBase,DynamoDB,MongoDB等 .
MarkLogic也是ACID complient . 我认为现在是最大的球员之一 .
YugaByte DB支持查询图层上的ACID Compliant distributed txns以及Redis和CQL API兼容性 .