《NoSQL权威指南》——1.3 ACID

1.3 ACID

已故的Jim Gray [2]在20世纪70年代才真正发明了现代事务处理,并在1981年6月写入经典论文“事务概念:优点和限制”(The Transaction Concept: Virtues and Limitations)。从这篇论文开始,有了ACID(原子性、一致性、隔离性和持久性)这个缩写词。Gray的论文论述了原子性、一致性、持久性,隔离性是后来补充的。Bruce Lindsay和他的同事于1979年在Gray的论文的基础上写了论文“分布式数据库要点”(Notes on Distributed Databases),并制定了一致性的基本原理和数据库复制的首要标准。1983年,Andreas Reute和Theo Härder发表了论文“面向事务的数据库恢复的原则”(Principles of Transaction-Oriented Database Recovery),并创造了ACID这个名词。

ACID这个术语的具体含义如下。

原子性。事务中的任务(或所有任务)要么全部执行,要么全不执行。这是或全或无的原则。如果事务中的一个元素失败,则整个事务失败。SQL坚守这一原则,INSERT语句会将整个数据集插入表中,DELETE语句会从表中删除整个一组行,UPDATE语句会删除并插入整个数据集。

一致性。事务必须在任何时候都满足系统定义的所有协议和规则。事务不能违反这些协议,同时数据库在事务开始和结束时必须保持在一致状态。在SQL中,这意味着在事务结束时所有的约束是TRUE。这可能是由于系统的新状态是有效的,或者是由于该系统回滚到其初始的一致状态。

隔离性。事务无法访问处于中间状态或未完成状态的任何其他事务的数据。因此,每一个事务自身都是独立的。在数据库中,性能和事务的一致性是必需的。但在SQL中不是这样,只有隔离级别的概念。会话可以在某些隔离级别看到未提交的数据。这个未提交的数据可以通过会话回滚,所以从某种意义上说,这些数据根本不存在。

持久性。一旦事务完成,它将是完整、持续的,并且不能被撤销。即便是在系统故障、断电或是其他类型的系统宕机的情况下数据也能存活。这是一个硬件问题,但是我们仍然在这方面做了很好的工作。当然,我们只是不要让数据在易失性存储器中存储,而是尽快将其持久化。

这项功能(特性)在大多数SQL数据库中是通过各种“加锁”的方案来实现的。“锁”会决定其他会话如何使用资源,如只读取提交的行,或者允许读未提交的行,等等。这就是所谓的悲观并发模型(pessimistic concurrency)。其基本假设是,你必须保护自己免受其他人的影响,并且冲突是常态。

另一种流行的并发模型称为乐观并发(optimistic concurrency)。如果你了解过数字影片行业,你就能理解这种模式。每个人都会得到数据的一个副本,然后按照他们希望的那样进行处理。在缩微胶片系统中,影片管理员制作电影文档(影片)的副本,并把它们分发出去。每位员工将修改他自己的副本,并把它(修改后的影片、文档)提交到文档纪录中心。

这种模型中假设:

查询比数据库变更常见得多,专为查询设计;
数据库变更过程中冲突极少发生,将其当作例外;
如果确实遇到冲突,相关的会话可以选择回滚,或者可以设置解决的规则。等待情况恢复正常,避免恐慌。

对于缩微胶片系统,大多数请求是读取信息,数据从来没有修改过。对内容进行修改的请求通常在时间上是分离的,所以它们不会产生冲突。当一名或多名员工做了同样的修改时,并不会产生冲突,修改会直接生效。当两个员工的修改有冲突时,影片经理会两个修改都拒绝,然后他等待通过应用规则或是稍后再做的新修改。

乐观并发取决于每一行的时间戳,保持历史副本。用户可以在一个自己知道出局苦处于某个ACID状态的时间点来查询数据库。用微缩胶片的比喻来说,就像中央记录员在等待他人返回其标记(修改)的副本时的处理方式一样。但是,这也意味着,我们在“时间=t0”时开始与该数据库交互,并且如我们所希望的那样,在“时间=t0, t1, t2,…, tn”时,基于所述时间戳同样能看到对应的数据。由于“锁”的作用,插入、删除和更新不会影响查询。如果要对一个恒定的流入数据进行查询,如股票和商品交易,乐观并发非常有用。

关于乐观并发的更详细信息将在关于流式数据库的5.1.1节中讨论。这种方法是最适于处理不断变化的数据,但又必须保持数据完整性,并在某个时间点呈现的数据一致视图的数据库。

需要关注的是:数据的集中管理方式并没有改变!

时间: 2024-11-10 11:50:34

《NoSQL权威指南》——1.3 ACID的相关文章

《NoSQL权威指南》导读

引言 NoSQL权威指南"没有什么会比引入新秩序更难,因为创新者必须要面对那些在旧环境中已经做得很好的对手,以及那些在新环境中做得很好的冷漠者." --Niccolo Machiavelli [1] 在过去的几十年,我已经通过Elsevier/Morgan Kaufmann出版社出版了一系列的书,这些书几乎全部是关于SQL和RDBMS的.而这本书对行业媒体中所谓的大数据.新SQL或NoSQL(我们这些极客非常喜欢流行语)做了一些概述.第一个创造或挖掘了新名词的专栏作家或博主很可能会在维

《NoSQL权威指南》——第1章 NoSQL和事务处理

第1章 NoSQL和事务处理 NoSQL权威指南简介本章讨论传统的批处理和事务处理.将作业队列读入大型计算机仍然是商业数据处理大量采用的方式.事务处理模型通过使用新的ETL工具来加载数据库,完成批处理作业.我们需要了解批处理和事务处理这两种模型以及它们在新技术中如何使用. 早期的时候,计算机系统只能做单路处理,也就是说计算机只能从头开始按照顺序完成一项作业.后来,有了多处理技术,多个作业可以共享计算机资源,但每个作业仍相互独立并在硬件队列中等着轮到自己执行. 这种方式演化为一种事务模型,并成为S

《NoSQL权威指南》——第2章 列式数据库

第2章 列式数据库 NoSQL权威指南简介从打孔卡和磁带的年代开始,文件就是物理设备上连续的字节,访问的方式是从文件开始(打开文件)到文件结束(文件结束的标志为TRUE).是的,存储可以在磁盘上被分割成数据页,并且各种数据页可以通过指针链连接,但这种模型仍然与前面提到的打孔卡.磁带是相同的.后来,文件被拆分成记录(record,更多物理连续的字节),记录又被拆分成字段(field,仍然是更多物理连续的字节). 文件被一条记录一条记录地处理(读/取一条,然后下一条)或按照物理存储位置顺序地处理(从

《NoSQL权威指南》——1.5 CAP定理

1.5 CAP定理 2000年,Eric Brewer在ACM分布式计算原理主题研讨会做了主题演讲,并介绍了CAP定理(也称Brewer定理).2002年,在麻省理工学院的Seth Gilbert和Nancy Lynch的努力下进行了修订和修改,后来又有很多人参与. 这个定理是针对分布式计算系统的,而传统并发模型会假设有中央并发管理机制.悲观并发模型有一个"交通警察",乐观并发模型有一个"服务领班".CAP代表一致性(consistency).可用性(availab

《NoSQL权威指南》——1.8 错误处理

1.8 错误处理 错误信息有两大类,我们可以遇到一些预料之中的问题,如无效密码,针对这些情况可以采用标准的响应或处理过程.假如我们忘记了正确的密码,并且在做多次尝试后仍不能使用正确的密码,就会被锁定. 第二类错误消息能告诉我们发生了什么事,可能会有使人厌烦的细节.这些信息会让用户进行一些处理操作或者让用户知道他为什么会失败. 但是有了NoSQL的发展和最终一致性模型的出现,事情也未必就会变得很舒服.系统还是会停止或锁定,不知道是为什么,可以做什么,或者需要多长时间来解决(如果能解决的话).截至2

《NoSQL权威指南》——1.4 悲观并发详解

1.4 悲观并发详解 悲观并发控制假定冲突是预料之中的情况,必须警惕.在关系数据库管理系统(relational database management system,RDBMS)中最流行的模型是基于加锁的.锁是一种允许一个用户会话对资源的访问同时保持或限制其他会话对同一资源的访问的装置.每个会话可以针对资源获得对应的锁,对资源进行修改,然后在数据库中提交(COMMIT)或回滚(ROLLBACK)相应的操作.COMMIT语句将修改持久保存,ROLLBACK语句将数据库恢复到会话之前的状态.如果修

《NoSQL权威指南》——2.1 列式数据库的历史

2.1 列式数据库的历史 列式存储以及倒排或不按顺序存储文件的方式并不是最新提出的.TAXIR是1969年为生物学建立的第一个列式数据库存储系统.加拿大统计局于1976年实现了RAPID系统,并将其用于加拿大人口和住房普查数据的处理和检索,以及其他与统计相关的一些应用.RAPID被拿来与世界各地的其他统计机构共享,并在20世纪80年代被广泛使用.直到20世纪90年代,它一直被加拿大统计局使用. 多年来,Sybase IQ是市面上唯一一个可以商用的列式DBMS.然而,当OLAP(online an

《NoSQL权威指南》——2.2 技术原理

2.2 技术原理 由于在列存储中的所有值都是同一类型的,并来自同一个域,计算其中第n行的位置很容易.所有列都按相同的顺序,因为它们在原始行中,所以要组装第i行,可以转到相关的列存储的第 i 个位置并且将它们连接起来.在电话号码的例子中,转到 area_codes.phone_exchange和phone_nbr列存储并且在每一列中并行查找第i条记录. 区号相对较小,所以它们最先返回,其次是交易所,最后是电话号码.当我第一次在Sand(nee引擎)数据库中看到这个时,是非常令人惊讶的.测试数据是一

《NoSQL权威指南》——1.7 服务器端一致性

1.7 服务器端一致性 在服务器端,我们可能在几个节点,但不一定是所有的节点,拥有相同的数据.如果所有n个节点都在一个数据值上达成一致,那么我们确定这个数据就是对的.生活是美好的. 但是,在针对"更新"建立共识的过程中,我们需要知道到目前为止邮件列表外有多少节点确认收到更新.我们正在寻找一个仲裁规则来审计节点故障和不完整复制.这些规则与应用程序不同.大型银行转账可能想要在所有节点上完全一致.一个网站购物车应用程序只要满足下面的条件就是令人满意的:客户返回给任何服务节点购物车的某个版本,