RDBMS和Nosql中的事务有何不同?

时间:2016-01-03 17:15:50

标签: transactions rdbms nosql

我试图了解NO-SQL和RDBMS模型之间的区别,并且我已经读过Web上的所有地方,RDBMS对NOSQL的事务有更好的支持。根据我读过的一篇博客,

  

在数据可靠性和执行事务的安全保证方面,SQL数据库仍然是更好的选择。

根据SO {/ 3>的answer

  

Dropping Atomicity可让您缩短时间表(数据集)的锁定时间。示例:MongoDB,CouchDB。

我理解原子性意味着什么,

  

假设我有一个与银行相关的交易,只有一个信用操作和一个借记操作,要么两者都会成功,要么没有人会成功。

如果没有事务,这个特定事务在no-sql世界中的行为如何?

3 个答案:

答案 0 :(得分:3)

首先,NoSQL不仅仅是一个模型,因为许多人(错误地)相信,此时有4种不同的模型:键值,文档,列和图,并且每个模型都彼此不同。每种不同型号都有许多供应商,每个供应商都包含一组不同的数据库功能。有NoSQL数据库支持事务和ACID属性,还有一些其他NoSQL数据库不支持。

要回答您的问题,如果您选择支持事务和ACID属性的NoSQL数据库,它与SQL相同,数据库会处理它。

但另一方面,如果您选择的数据库不直接支持事务,那么责任在于应用程序本身。 有一些策略可以解决这个问题,例如2-phase commit

希望它有所帮助。

答案 1 :(得分:1)

我的猜测是,当你说NoSQL时,你的意思是一个纯粹的键值NoSQL数据库。这不允许您以原子方式更改两个不同键的两个值。

在您的每个交易通过特定密钥更改一个值时,这些数据库在许多情况下仍然有用。

但是,如果借记一个帐户并另外一个帐户,您应该使用另一个支持“全部或全部”的SQL或NoSQL数据库进行至少两次操作。

所以NoSQL意味着没有SQL而不是没有交易。

答案 2 :(得分:1)

通常NoSQL数据存储仅缺少原子多键更新并仅在文档级别上支持事务。这意味着如果您使用简单的方法将资金从一个帐户转移到另一个帐户,您可能会得到非常意外的结果。这里有几种可能发生的情况:

  • 提取资金,在转移过程中出错,丢失了有关交易的信息,从而丢失了资金
  • 在同时撤销操作(双重支出)的情况​​下从帐户中提取两次相同的钱
  • 撤回并成功将资金存入目标帐户但由于并发帐户更新(丢失更新)而丢失了

但您可以在应用程序级别实施ACID事务以防止此类情况。如果数据存储支持每个键的线性化和比较和设置(文档级原子性),那么它足以实现客户端事务,更多的是你有几个选项可供选择:

  1. 如果您需要Serializable隔离级别,那么您可以使用Google用于Percolator系统或Cockroach Labs CockroachDB的相同算法。我发表了关于它的博客并创建了step-by-step visualization,我希望它能帮助您理解算法背后的主要思想。

  2. 如果您希望获得较高的争用,但您可以获得Read Committed隔离级别,那么请查看Peter Bailis的RAMP transactions

  3. 第三种方法是使用补偿交易,也称为传奇模式。它在80年代晚期的Sagas论文中有所描述,但随着分布式系统的发展变得越来越实际。请参阅Applying the Saga Pattern对话获取灵感。