【转】涨姿势了,数据库隔离性的几个级别

原文:http://blog.sina.com.cn/s/blog_3fc85e260100msz3.html

每个事务使得数据库从一个一致的永久状态原子地转移到一个新的一致的永久状态,可以说,事务的ACID(the transactional properties of Atomicity, Consistency, Isolation and Durability)属性是数据库事务的灵魂:

·  原子性

事务的原子性首先体现在事务对数据的修改,即要么全都执行,要么全都不执行,例如,从银行账户A转一笔款项a到账户B,结果必须是从A的账户上扣除款项a并且在B的账户上增加款项a,不能只是其中一个账户的修改。但是,事务的原子性并不总是能够保证修改一定完成了或者一定没有进行,例如在ATM机器上进行上述转账,转账指令提交后通信中断或者数据库主机异常了,那么转账可能完成了也可能没有进行:如果通信中断发生前数据库主机完整接收到了转账指令且后续执行也正常,那么转账成功完成了;如果转账指令没有到达数据库主机或者虽然到达但后续执行异常(例如写commit log失败或者账户余额不足),那么转账就没有进行。要确定转账是否成功,需要待通信恢复或者数据库主机恢复后查询账户交易历史或余额。事务的原子性也体现在事务对数据的读取上,例如一个事务对同一数据项的多次读取的结果一定是相同的。

·  一致性

事务需要保持数据库数据的正确性、完整性和一致性,有些时候这种一致性由数据库的内部规则保证,例如数据的类型必须正确,数据值必须在规定的范围内,等等;另外一些时候这种一致性由应用保证的,例如一般情况下银行账务余额不能是负数,信用卡消费不能超过该卡的信用额度等。

·  隔离性

许多时候数据库在并发执行多个事务,每个事务可能需要对多个表项进行修改和查询,与此同时,更多的查询请求可能也在执行中。数据库需要保证每一个事务在它的修改全部完成之前,对其他的事务是不可见的,换句话说,不能让其他事务看到该事务的中间状态,例如,从银行账户A转一笔款项a到账户B,不能让其他事务(例如账户查询)看到A账户已经扣除款项a但B账户却还没有增加款项a的状态。

·  持久性

事务完成后,它对于数据库的影响是永久性的,即使系统出现各种异常也是如此。

出于性能考虑,许多数据库允许使用者选择牺牲隔离属性来换取并发度,从而获得性能的提升。SQL定义了4种隔离级别:

  • Read uncommitted (RU):读取未提交的数据,即其他事务已经修改但还未commit的数据,这是最低的隔离级别;
  • Read committed (RC):在一个事务中,对同一个项,前面的读取跟后面的读取结果可能不一样,例如第一次读取时另一个事务的修改还没有提交,第二次读取时已经提交了;
  • Repeatable read (RR):可重复读取,在一个事务中,对同一个项,前面的读取跟后面的读取结果一样;
  • Serializable (S):可序列化,即数据库的事务是可串行化执行的,就像一个事务执行的时候没有别的事务同时在执行,这是最高的隔离级别;

隔离级别的降低可能导致读到脏数据或者事务执行异常,例如:

  • Lost update (LU):两个事务同时修改一个数据项,但后一个事务中途失败退出,则对数据项的两个修改可能都丢失;
  • Dirty Reads (DR):一个事务读取某数据项,但另一个事务更新了此数据项却没有提交,这样所有的操作可能都得回滚;
  • Non-repeatable Reads (NRR):一个事务对同一数据项的多次读取可能得到不同的结果;
  • Second lost updates problem (SLU):无法重复读取的特例:两个并发事务同时读取和修改同一数据项,则后面的修改可能使得前面的修改失效;
  • Phantom Reads (PR):也称为幻读,例如在事务执行过程中,由于前面的查询和后面的查询的期间有另外一个事务插入数据,后面的查询结果出现了前面查询结果中未出现的数据。

隔离级别与读写异常(不一致)的关系如下:


LU


DR


NRR


SLU


PR


RU


Y


Y


Y


Y


Y


RC


N


N


Y


Y


Y


RR


N


N


N


N


Y


S


N


N


N


N


N

容易发现,在最高隔离级别serializable下,数据不会出现读写的不一致。

不同的数据库支持的隔离级别不尽相同,例如oracle只支持read committed和serializable两个级别,MySQL支持全部四个级别。

OceanBase的事务实现与经典关系数据库有所不同,其读事务基本是分布式并发执行的,写事务目前是集中式串行执行的,即serializable,且任何一个写事务在commit之前对其他读写事务都是不可见的,因此OceanBase是强一致的。

时间: 2024-10-09 19:31:22

【转】涨姿势了,数据库隔离性的几个级别的相关文章

数据库的隔离性与隔离级别以及隔离级别产生的影响

隔离性:个人理解是要保证两个同时发生的事务之间不会感受到对方的存在,不会相互影响.和其他三个原则(原子性.一致性.持久性)是数据操作需要注意的原则.为了满足隔离性,辅助的提出了4个隔离级别,当然约束越严格效率就越低. 隔离级别: 1)read uncommitted 读取未提交的数据,即A事务可以看到其他事务已经加减但是未提交的数据. A事务可以读到B事务已经加减的数据但如果B事务之后失败发生回滚  A事务就读到了被回滚的脏数据 所以网上常叫"脏读" 2)read committed 

谈数据库事务隔离性

写在前面 近两年分布式数据库技术加速发展,而由于金融行业技术生态的限制,周围很多同学对其并没有深入的了解,所以进行高性能.高可靠系统设计时往往缺少这一利器.Ivan希望以系列文章的方式与大家交流探讨,加深我们对分布式数据库的认识.本文是该系列文章的第一篇,主要探讨事务管理中的隔离性,厘清相关概念和关键技术,为后面阐述分布式数据库的事务管理做一个铺垫,姑且算是一篇前传吧. 正文 我们首先从定义出发,事务管理包括原子性.一致性.隔离性和持久性四个方面,即ACID.所有数据库专著都会给出这个四个特性的

数据库事务的ACID(原子性,一致性,隔离性,持久性)四大特性

我从维基百科翻译的.翻译水平有限: 在计算机科学中,ACID(原子性,一致性,隔离性,持久性)是数据库事务的一组属性,旨在即使在发生错误,断电等情况下也可以确保有效性.在数据库的上下文中,这是指一系列数据库操作,它们可以满足ACID属性(并且可以将这些属性视为对数据的单个逻辑操作)称为事务.例如,从一个银行帐户到另一个银行帐户的资金转移,即使涉及多个更改,例如从一个帐户借记而向另一个帐户贷记,也只是一次交易. 1983年, Andreas Reuter和TheoHärder在吉姆·格雷(Jim

数据库隔离级别详解

事务(transaction)是数据库管理系统的执行单位,可以是一个数据库操作(如Select操作)或者是一组操作序列.事务ACID属性,即原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability). 原子性:保证事务中的所有操作全部执行或全部不执行.例如执行转账事务,要么转账成功,要么失败.成功,则金额从转出帐户转入到目的帐户,并且两个帐户金额将发生相应的变化:失败,则两个账户的金额都不变.不会出现转出帐户扣了钱,而目的帐户没有

事务四大特征:原子性,一致性,隔离性和持久性(ACID)

一.事务 定义:所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位. 准备工作:为了说明事务的ACID原理,我们使用银行账户及资金管理的案例进行分析. [sql] view plaincopyprint? // 创建数据库 create table account( idint primary key not null, namevarchar(40), moneydouble ); // 有两个人开户并存钱 insert into account valu

2014/7/27------数据库的隔离性

演示不同隔离级别下的并发问题 1.当把事务的隔离级别设置为read uncommitted ,会引发脏读,不可重复读,虚读 A窗口 start transaction isolation  level  read uncommitted; start transaction; select * from account; =======这个时候发现aaa的账户是1000元,转到B窗口 select * from acount where name=='aaa'; =======发现aaa的账户多

spring事务的传播机制和隔离性

1.事务的传播机制: 指多个事务方法在相互调用时,事务如何在这些方法中传播. Spring支持7种事务传播行为: PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中.这是最常见的选择. PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行. PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常. PROPAGATION_REQUIRES_NEW 新建事务,

acid-事务的原子性、一致性、隔离性、持久性

原子性  多个事情组成一个单元,要么同时成功或失败,不能只运行其中一个 一致性  事务处理要将数据库从一种状态转变为另一种状态. 一旦提交了修改数据,那么其它人读取这个数据,也是被修改后的数据 隔离性  在事务处理提交之前,事务处理的效果不能由系统中其它事务处理 多个用户,不能同时读写同一个数据,应该有先后顺序,在数据库中是一个一 个事件地运行,如果事 的条件不满足,后续事件就回滚 持久性  事件一旦提交成功,数据就发生了变化 例如: 网上定票系统,扣钱和定票是一个事务,它需要有原子性即不能只运

事务的四大属性ACID即事务的原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability.。

事务的四大属性ACID即事务的原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability.. 原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生. 一致性(Consistency) 事务必须使数据库从一个一致性状态变换到另外一个一致性状态. 隔离性(Isolation) 事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并