文档章节

MYSQL事务——四个隔离级别

w
 waterme
发布于 2016/07/09 23:28
字数 1569
阅读 1
收藏 0
点赞 0
评论 0

数据库事务的隔离级别有4个,由低到高依次为Read uncommitted(读未提交)、Read committed(读提交)、Repeatable read(重复读)、Serializable(序列化),这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。

 

脏读:在一个事务A在提交的过程中另一个事务B对其进行了查询,B读到的数据为修改后的数据,而此时事务A发现操作错误将之前的修改回滚到了最初状态,那么事务B读到的数据就是错误的数据,产生了脏读。总结就是一个事务读到了另一个事务尚未提交的数据,而之后另一个事务因为某些原因将提交的状态又回滚了,此时就产生了脏读。解决方法:在一个事务写操作提交之前,另一个事务不能对其进行读。
不可重复读:事务A多次读取一个数据,事务A一次读取,读到的数据为20。后另一个事务B对其进行了修改,将20改为30,事务A再一次读取该数据,第二次读到的数据为30,在事务A两次读取中的结果是不一致的,这就是不可重复读。总结就是一个事务不断的对某数据进行查询,在查询过程中另一个事务对该数据进行了修改(已提交),就发生了两次读取数据不一致的现象,即不可重复读。解决方法:一个事务读操作时,另一个事务不能进行写操作。
幻读:幻读发生在事务不是独立执行的时候。比如有两个事务AB,两个事务都要对表进行操作,事务A修改了表中的全部数据而此时事务B在表中添加了一行,之后事务A就会发现表中还有未修改的数据,就会产生幻读。预防的方式就是在一个事务完成对表的操作时其他事务均不能在表中添加新的行。解决方法:一个事务读写操作时,另一个事务不能对其就行读写操作。
脏读、不可重复读、幻读三者的区别:
脏读:事务A读、事务B写但未提交
不可重复读:事务A多次读,事务B在事务A读数据中对M进行了修改(已提交,脏读是未提交)。

幻读:跟前两者不同的是两个事务都要发生写操作。

 




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

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

本文转载自:http://blog.csdn.net/feihongxueni/article/details/51151698

共有 人打赏支持
w
粉丝 0
博文 27
码字总数 0
作品 0
海淀
MySQL InnoDB存储引擎的事务隔离级别

我们知道,在关系数据库标准中有四个事务隔离级别: 未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据 提交读(Read Committed):只能读取到已经提交的...

miyae
2014/03/25
0
0
SQL--事物隔离级别

数据库事务的隔离级别有4个,由低到高依次为Read uncommitted、Read committed、Repeatable read、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。 事务隔离.png ...

HaleyLiu
2017/12/09
0
0
MySQL MVCC && 事务隔离级别 && 锁

MySQL MVCC && 事务隔离级别 && 锁 InnoDB多版本并发控制——MVCC http://my.oschina.net/xinxingegeya/blog/208821 MySQLS锁X锁read lockwrite lock http://my.oschina.net/xinxingegeya/bl......

秋风醉了
2014/07/30
0
0
012,spring boot事务概念讲解

事务处理 一、事务有四个特性: ACID 原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。 一致性(Consistency):一旦事务...

岸芷汀兰
2016/12/05
64
0
事务隔离级别

在SQL标准中定义了四种隔离级别,每种隔离级别都规定了一个事务中所做的修改,哪些事务内和事务间是可见的,哪些是不可见的。较低级别的隔离通常可以执行更高的并发,系统的开销也更低。 *每...

青春掌柜
2016/05/26
0
0
2017 11-06 mysql应用

一.mariadb的安装与配置 (1)mariadb的安装 1.虚拟机上的base源yum安装 yum install mariadb-server 2.在www.mariadb.org绿色安装gz格式的包,然后解压即可 现在常用5版本的mariadb (2)mariad...

楠人帮
2017/11/09
0
0
DB2 SQL RR/RS/CS/UR四个级别(转)

1.RR隔离级别:在此隔离级别下, DB2会锁住所有相关的纪录。在一个SQL语句执行期间,所有执行此语句扫描过的纪录都会被加上相应的锁。具体的锁的类型还是由操作的类型来决定,如果是读取,则...

JackMo2015
03/02
0
0
数据库隔离级别以及悲观锁和乐观锁

数据库隔离级别 目的:保证事务并发读取数据的正确性 数据库事务隔离级别 (1)Read uncommitted(读未提交数据):允许事务读取未被其他事务提交的变更数据,会出现脏读、不可重复读和虚读。...

JackMo2015
03/06
0
0
mysql事务隔离级别和锁

事务的核心是锁和并发,采用同步控制的方式保证并发的情况下性能尽可能高,且容易理解。 一、事务有四个基本特性: 1、原子性(atomicity):数据库操作的最小基本单位,事务内的操作要么都成功...

比雷
2016/12/09
6
0
Spring框架笔记(二十七)—— 事务的隔离级别、回滚属性、只读属性、timeout

自从有了并发,原有的程序哪儿哪儿都不好了——小白语录。 并发事务所导致的问题: 当同一个应用程序或者不同应用程序中的多个事务在同一个数据集上并发执行时, 可能会出现许多意外的问题 并...

HappyBKs
2015/10/04
742
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

about git flow

  昨天元芳做了git分支管理规范的分享,为了拓展大家关于git分支的认知,这里我特意再分享这两个关于git flow的链接,大家可以看一下。 Git 工作流程 Git分支管理策略   git flow本质上是...

qwfys
今天
1
0
Linux系统日志文件

/var/log/messages linux系统总日志 /etc/logrotate.conf 日志切割配置文件 参考https://my.oschina.net/u/2000675/blog/908189 dmesg命令 dmesg’命令显示linux内核的环形缓冲区信息,我们可...

chencheng-linux
今天
1
0
MacOS下给树莓派安装Raspbian系统

下载镜像 前往 树莓派官网 下载镜像。 点击 最新版Raspbian 下载最新版镜像。 下载后请,通过 访达 双击解压,或通过 unzip 命令解压。 检查下载的文件 ls -lh -rw-r--r-- 1 dingdayu s...

dingdayu
今天
0
0
spring boot使用通用mapper(tk.mapper) ,id自增和回显等问题

最近项目使用到tk.mapper设置id自增,数据库是mysql。在使用通用mapper主键生成过程中有一些问题,在总结一下。 1、UUID生成方式-字符串主键 在主键上增加注解 @Id @GeneratedValue...

北岩
今天
2
0
告警系统邮件引擎、运行告警系统

告警系统邮件引擎 cd mail vim mail.py #!/usr/bin/env python#-*- coding: UTF-8 -*-import os,sysreload(sys)sys.setdefaultencoding('utf8')import getoptimport smtplibfr......

Zhouliang6
今天
0
0
Java工具类—随机数

Java中常用的生成随机数有Math.random()方法及java.util.Random类.但他们生成的随机数都是伪随机的. Math.radom()方法 在jdk1.8的Math类中可以看到,Math.random()方法实际上就是调用Random类...

PrivateO2
今天
2
0
关于java内存模型、并发编程的好文

Java并发编程:volatile关键字解析    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在...

DannyCoder
昨天
0
0
dubbo @Reference retries 重试次数 一个坑

在代码一中设置 成retries=0,也就是调用超时不用重试,结果DEBUG的时候总是重试,不是0吗,0就不用重试啊。为什么还是调用了多次呢? 结果在网上看到 这篇文章才明白 https://www.cnblogs....

奋斗的小牛
昨天
2
0
数据结构与算法3

要抓紧喽~~~~~~~放羊的孩纸回来喽 LowArray类和LowArrayApp类 程序将一个普通的Java数组封装在LowArray类中。类中的数组隐藏了起来,它是私有的,所以只有类自己的方法才能访问他。 LowArray...

沉迷于编程的小菜菜
昨天
1
0
spring boot应用测试框架介绍

一、spring boot应用测试存在的问题 官方提供的测试框架spring-boot-test-starter,虽然提供了很多功能(junit、spring test、assertj、hamcrest、mockito、jsonassert、jsonpath),但是在数...

yangjianzhou
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部