Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Transactions RDBMS和Nosql中的事务有何不同?_Transactions_Rdbms_Nosql - Fatal编程技术网

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

Transactions RDBMS和Nosql中的事务有何不同?,transactions,rdbms,nosql,Transactions,Rdbms,Nosql,我试图理解NO-SQL和RDBMS模型之间的区别,我在网上的任何地方都读到,RDBMS比NOSQL更好地支持事务。根据我读到的一篇博客 在数据可靠性和执行事务的安全保证方面,SQL数据库仍然是更好的选择 根据这一点等等 删除原子性可以缩短锁定的时间表(数据集)。示例:MongoDB、CouchDB 我理解原子性的含义 假设我有一个与银行相关的交易,有一个贷记操作和一个借记操作,要么两者都会成功,要么没有人会成功 如果没有事务,这个特定的事务在没有sql的世界中是如何运行的?首先,NoSQL并不是

我试图理解NO-SQL和RDBMS模型之间的区别,我在网上的任何地方都读到,RDBMS比NOSQL更好地支持事务。根据我读到的一篇博客

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

根据这一点等等

删除原子性可以缩短锁定的时间表(数据集)。示例:MongoDB、CouchDB

我理解原子性的含义

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


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

首先,NoSQL并不是许多人(错误地)认为的一种模型,在这一点上有4种不同的模型:键值、文档、列和图,并且每种模型都各不相同。每个不同的模型都有许多供应商,每个供应商都为数据库提供了一组不同的功能。有支持事务和ACID属性的NoSQL数据库,也有其他一些不支持事务和ACID属性的NoSQL数据库

为了回答您的问题,如果您选择一个支持事务和ACID属性的NoSQL数据库,它与SQL相同,由数据库来处理它

但另一方面,如果您选择的数据库不直接支持事务,那么责任就在于应用程序本身。 有一些被普遍接受的策略来处理这个问题,比如


希望它能有所帮助。

首先,NoSQL并不是很多人(错误地)认为的一种模型,在这一点上有4种不同的模型:键值、文档、列和图形,并且每种模型都是不同的。每个不同的模型都有许多供应商,每个供应商都为数据库提供了一组不同的功能。有支持事务和ACID属性的NoSQL数据库,也有其他一些不支持事务和ACID属性的NoSQL数据库

为了回答您的问题,如果您选择一个支持事务和ACID属性的NoSQL数据库,它与SQL相同,由数据库来处理它

但另一方面,如果您选择的数据库不直接支持事务,那么责任就在于应用程序本身。 有一些被普遍接受的策略来处理这个问题,比如


希望它能有所帮助。

我的猜测是,当你说NoSQL时,你指的是一个纯键值的NoSQL数据库。这不允许您自动更改两个不同键的两个值

在许多情况下,当您的每个事务通过特定的键只更改一个值时,这些数据库仍然很有用

但是,在借记一个帐户和贷记另一个帐户的情况下,您应该使用另一个SQL或NoSQL数据库,该数据库至少支持两个操作的“全部或无”


所以NoSQL意味着没有SQL,但不是没有事务。

我的猜测是,当你说NoSQL时,你指的是一个纯键值的NoSQL数据库。这不允许您自动更改两个不同键的两个值

在许多情况下,当您的每个事务通过特定的键只更改一个值时,这些数据库仍然很有用

但是,在借记一个帐户和贷记另一个帐户的情况下,您应该使用另一个SQL或NoSQL数据库,该数据库至少支持两个操作的“全部或无”


因此,NoSQL意味着没有SQL,但不意味着没有事务。

通常NoSQL数据存储缺少原子多键更新,只支持文档级别的事务。这意味着,如果您使用直接的方法将资金从一个帐户转移到另一个帐户,您可能会得到非常意外的结果。以下是一些可能发生的情况:

  • 取款,在转账过程中出错,丢失了交易信息,因此丢失了钱
  • 在同时提款操作(双重支出)的情况下,从账户中两次提取相同的资金
  • 取款并成功地将钱存入目标帐户,但由于并发帐户更新(丢失更新)而丢失
但您可以在应用程序级别实现ACID事务,以防止出现此类情况。如果数据存储支持每键线性化和比较与设置(文档级原子性),那么就足以实现客户端事务,除此之外,您还有几个选项可供选择:

  • 如果您需要可序列化的隔离级别,那么您可以遵循谷歌用于系统或蟑螂实验室的相同算法。我已经在博客上写过,并创建了一个,我希望它能帮助你理解算法背后的主要思想

  • 如果您期望高争用性,但阅读了Committed isolation level对您来说没问题,那么请查看Peter Bailis的文章

  • 第三种方法是使用补偿事务,也称为saga模式。本文在80年代后期对其进行了描述,但随着分布式系统的兴起,它变得更加实际。请看演讲获得灵感


  • 通常,NoSQL数据存储缺少原子多键更新,只支持文档级别的事务。这意味着,如果您使用直接的方法将资金从一个帐户转移到另一个帐户,您可能会得到非常意外的结果。以下是一些可能发生的情况:

    • 取款,在转账过程中出错,丢失了交易信息,因此丢失了钱
    • 在同时提款操作(双重支出)的情况下,从账户中两次提取相同的资金
    • 取款并成功地将钱存入目标帐户,但由于并发帐户upda而丢失