数据库事务隔离级别

转载 2016年08月30日 20:47:07

本文系转载,原文地址:http://singo107.iteye.com/blog/1175084

数据库事务的隔离级别有4个,由低到高依次为Read uncommittedRead committedRepeatable readSerializable,这四个级别可以逐个解决脏读不可重复读幻读这几类问题。


√: 可能出现    ×: 不会出现

脏读 不可重复读 幻读
Read uncommitted
Read committed ×
Repeatable read × ×
Serializable × × ×

 

注意:我们讨论隔离级别的场景,主要是在多个事务并发的情况下,因此,接下来的讲解都围绕事务并发。

Read uncommitted 读未提交

公司发工资了,领导把5000元打到singo的账号上,但是该事务并未提交,而singo正好去查看账户,发现工资已经到账,是5000元整,非常高兴。可是不幸的是,领导发现发给singo的工资金额不对,是2000元,于是迅速回滚了事务,修改金额后,将事务提交,最后singo实际的工资只有2000元,singo空欢喜一场。


 

出现上述情况,即我们所说的脏读,两个并发的事务,“事务A:领导给singo发工资”、“事务B:singo查询工资账户”,事务B读取了事务A尚未提交的数据。

当隔离级别设置为Read uncommitted时,就可能出现脏读,如何避免脏读,请看下一个隔离级别。

Read committed 读提交

singo拿着工资卡去消费,系统读取到卡里确实有2000元,而此时她的老婆也正好在网上转账,把singo工资卡的2000元转到另一账户,并在singo之前提交了事务,当singo扣款时,系统检查到singo的工资卡已经没有钱,扣款失败,singo十分纳闷,明明卡里有钱,为何......

出现上述情况,即我们所说的不可重复读,两个并发的事务,“事务A:singo消费”、“事务B:singo的老婆网上转账”,事务A事先读取了数据,事务B紧接了更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。

当隔离级别设置为Read committed时,避免了脏读,但是可能会造成不可重复读。

大多数数据库的默认级别就是Read committed,比如Sql Server , Oracle。如何解决不可重复读这一问题,请看下一个隔离级别。

Repeatable read 重复读

当隔离级别设置为Repeatable read时,可以避免不可重复读。当singo拿着工资卡去消费时,一旦系统开始读取工资卡信息(即事务开始),singo的老婆就不可能对该记录进行修改,也就是singo的老婆不能在此时转账。

虽然Repeatable read避免了不可重复读,但还有可能出现幻读

singo的老婆工作在银行部门,她时常通过银行内部系统查看singo的信用卡消费记录。有一天,她正在查询到singo当月信用卡的总消费金额(select sum(amount) from transaction where month = 本月)为80元,而singo此时正好在外面胡吃海塞后在收银台买单,消费1000元,即新增了一条1000元的消费记录(insert transaction ... ),并提交了事务,随后singo的老婆将singo当月信用卡消费的明细打印到A4纸上,却发现消费总额为1080元,singo的老婆很诧异,以为出现了幻觉,幻读就这样产生了。

注:MySQL的默认隔离级别就是Repeatable read。

Serializable 序列化

Serializable是最高的事务隔离级别,同时代价也花费最高,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻像读。


很多人容易搞混不可重复读和幻读,确实这两者有些相似。但不可重复读重点在于update和delete,而幻读的重点在于insert。

如果使用锁机制来实现这两种隔离级别,在可重复读中,该sql第一次读取到数据后,就将这些数据加锁,其它事务无法修改这些数据,就可以实现可重复 读了。但这种方法却无法锁住insert的数据,所以当事务A先前读取了数据,或者修改了全部数据,事务B还是可以insert数据提交,这时事务A就会 发现莫名其妙多了一条之前没有的数据,这就是幻读,不能通过行锁来避免。需要Serializable隔离级别 ,读用读锁,写用写锁,读锁和写锁互斥,这么做可以有效的避免幻读、不可重复读、脏读等问题,但会极大的降低数据库的并发能力。


关于数据库事务隔离级别的介绍

事务(Transaction)是并发控制的基本单位。所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如,银行转账工作:从一个账号扣款并使另一个账号增款,这...
  • xiasihua88
  • xiasihua88
  • 2011年02月16日 09:06
  • 1328

数据库事务四种隔离级别

定义: 在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别。 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted(未授权读取、读未提交)、Read com...
  • tolcf
  • tolcf
  • 2015年10月20日 22:40
  • 19754

数据库事务隔离级别和锁的实现方式

当数据库中多个事务(Transaction)处理同一数据时,就会出现并发的问题,也就是需要解决数据库隔离性的问题(isolation)。     数据库的事务操作主要会碰到以下几类问题:     ...
  • yangtianyu1218
  • yangtianyu1218
  • 2016年05月31日 10:20
  • 1407

数据库事务隔离级别实例探讨

我们知道,数据一般有如下四种隔离级别  0.  read uncommitted (读未提交)1.  read committed (读已提交)2.  repeatabale read (可重复读...
  • xidianliuy
  • xidianliuy
  • 2016年06月02日 09:47
  • 757

数据库事务特性、并发、隔离级别、锁种类、锁粒度

本文解释数据库并发控制事务 对数据库数据执行的一系列操作,可以是一条或者多条SQL语句 数据库事务特性1、 原子性 对数据库数据的一系列操作,要么全部执行,要么都不 执行 2、 一致性 数...
  • lo11ve
  • lo11ve
  • 2017年11月26日 13:21
  • 98

数据库事务的四个隔离级别浅析

数据库事务的隔离级别有4个,由低到高依次为Read uncommitted 、Read committed、Repeatable read 、Serializable ,这四个级别可以逐个解决脏读 、...
  • IWantToHitRen
  • IWantToHitRen
  • 2015年09月24日 22:51
  • 2072

面试篇之对数据库事务隔离级别的理解

所谓数据库隔离级别,就是为了解决两个或多个事务之间操作同一个数据库对象是出现的冲突问题。对数据的操作无非是读写,事务隔离级别也主要是在事务的读写之间进行隔离。 首先列一下4种隔离级别: 1.rea...
  • HUXU981598436
  • HUXU981598436
  • 2014年10月16日 21:08
  • 1329

查看和修改MySQL数据库的事物隔离级别

查看和修改MySQL数据库的事物隔离级别查看MySQL的事物隔离级别mysql> show variables like '%isolation%'; +---------------+-------...
  • zhu4674548
  • zhu4674548
  • 2017年07月16日 01:05
  • 1274

MySql事务隔离级别锁机制实际案例深入分析

很多情况下,我们可能并没有过多的关注事务隔离级别和锁机制,可能在部分人看来,这些是晦涩难懂的冷门知识。本文通过分析一个简短的DEMO演示各种事务隔离级别下、各种锁定情况下并发执行时对数据更新差异,你将...
  • cpaqyx
  • cpaqyx
  • 2014年11月30日 19:44
  • 988

数据库事务,隔离级别

数据库事务,隔离级别事务的四个性质: 原子性(Atomicity):要么都发生,要么都不发生。记录之前的版本,允许回滚。 一致性(Consistency):各有各的理解 隔离性(Isolation):...
  • about4years
  • about4years
  • 2017年08月24日 21:09
  • 61
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据库事务隔离级别
举报原因:
原因补充:

(最多只允许输入30个字)