MySql的隔离级别总结
使用MySql也有一段时间了,但是很多MySql相关或者说是数据库相关的知识还是一知半解,最近在学hibernate这个框架时碰到挺多和数据库相关的知识盲区,所以下面根据自己对MySql系统相关知识消化的结果进行简单总结,这是总结关于事务隔离级别的博客 。
一、事务的性质:原子性,隔离性和一致性概念。
1、原子性:数据库的操作是以一组mysql指令进行的,数据库要有这样一种保证:每次事务操作的多条sql语句要么全部执行成功,要不全部执行失败,不可以某些sql语句执行成功而另外一些执行成功。原子性是针对程序的事务而言的,它体现了一个事务,就是数据库的最小组成部分。
2、隔离性:在并发操作中,数据应该是被隔离开来的,也就是说,保证在某种并发操作中数据只能有一条线程访问,和线程当中的同步类似,不同的隔离级别会对应不同的线程并发操作,这个是本篇博客的重点,后面具体总结。
3、一致性:数据库的所有数据均是有意义的状态,也就是说数据应该前后一致。这里可以用转账例子理解:A转账100块给B,数据的一致性要求A-100而B增加100,两者同时发生,数据才是有意义的,也就是数据库才能保证一致性。总的来说,无论是原子性还是隔离性,其实都是为了保证一致性。
二、隔离级别(mysql)
MySql主要有四个隔离级别:读未提交,读已提交,重复读以及串行化,四个级别依次从低到高。
1、读未提交。先上个简单的丑图:
读未提交的意思就是:读操作可以读未提交事务的sql语句对数据库的操作。这种隔离机制无法保证数据的原子性,读了没有提交成功的数据便是脏读。读未提交本身就是不能保证原子性,所以一般不会用。
2、读已提交。先看丑图
读已提交的意思是,数据读取必须要在处理该数据的事务被回滚或者提交完成后才进行,这样可以保证同一数据的修改和读取不同时进行,从而保证数据的一致性。当然,它解决了脏读的问题,但是却没有解决另外一个问题,即不可重复读的带来的问题,先看下面丑图:
不可重复读使得在线程一在两个sql指令(假设他们是同一个指令)读取相同的数据前后读取出现了不一样的结果,因为在sql指令一和二之间的时间间隔里面另外一条线程对数据进行更新操作,当然,这也可以理解为数据及时更新所造成的。但是,读者可能会疑惑,这样到底会造成什么后果?举个例子,小明去商场买东西,在结账之前他首先查询了下自己的余额够不够用,发现余额是充足的,然后愉快地去结账了,但是在这个短短时间内,他老婆利用了他的银行卡进行了转账操作,小明买单时发现扣款失败,余额不足,这便会给小明带来困惑:老子明明卡里面的钱还足够的,为毛扣费不成功,当然,数据前后读取不一致还会导致很多其他问题,具体不细说。
归根到底,不可重复读的问题是由于现场一在进行读操作时没有锁定数据,造成了前后读取数据的不一致。
3、可重复读,解决上面不可重复读问题。其实他就是在不可重复读的基础上,当数据在前后两个读取操作时都相应地加上对应数据的锁,使得两次读取期间不能有其他线程对数据进行操作,保证读的结果是重复的(也即是保证读数据的一致性)。具体图就不画了,理解起来应该不难。
可重复读解决了读数据一致性的问题,但是却不能解决另外一个问题:幻读,下面是幻读的简单示意图:
总的来说,幻读是由于前面三种隔离级别都只是隔离了数据行,当涉及会影响到整个表的操作(插入,删除等会意向整个表的个数)时,便无法保证所有数据同步的目的,而幻读便是这样产生的。
4、串行化。上面也说了,前面三种级别,都只是隔离了要操作的相应数据行,无法杜绝幻读的现象,而串行化是mysql隔离最高级别,它锁定了整个表,是的所有线程的操作都是串行进行的,可彻底杜绝幻读的情况。当然,锁定整个表,性能会下降得非常厉害,所以实际中应该谨慎的选择。
总的来说,前三中隔离级别隔离的是行数据,他们的不同只是对应读、写之间的锁定关系不同而已,读未提交,事务进行写操作时并没有锁定禁止读的动作;读已提交在进行事务在进行写操作时锁定了行数据,禁止在写期间读数据;而可重复读则是在读期间禁止数据的写;串行化即锁定整个表的读写。
MySql的隔离级别总结的更多相关文章
- mysql 数据库隔离级别
select @@tx_isolation; 4种隔离级别 1.read uncommitted 2.read committed 3.repeatable read(MySQL默认隔离级别) 4. ...
- mysql事务隔离级别和MVCC
一.三种问题: 脏读(Drity Read):事务A更新记录但未提交,事务B查询出A未提交记录. 不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次 ...
- Mysql得隔离级别
一.首先什么是事务? 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事 ...
- Mysql的隔离级别
一.首先什么是事务? 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事 ...
- [51CTO]新说MySQL事务隔离级别!
新说MySQL事务隔离级别! 事务隔离级别这个问题,无论是校招还是社招,面试官都爱问!然而目前网上很多文章,说句实在话啊,我看了后我都怀疑作者弄懂没!本文所讲大部分内容,皆有官网作为佐证,因此对本文内 ...
- 查询mysql事务隔离级别
查询mysql事务隔离级别 查询mysql事务隔离级别 分类: DB2011-11-26 13:12 2517人阅读 评论(0) 收藏 举报 mysqlsessionjava 1.查看当前会话隔离 ...
- mysql 事务隔离级别详解
事物的 隔离级别,说简单非常简单(新手也能说出 是个隔离级别 和 影响),说男也非常难.(很多 有几年编程 经验的程序员依旧搞不清楚) 废话不多少 直接开始: 事务的隔离级别 是用来描述 事务的读关系 ...
- mysql数据库隔离级别
# 原创,转载请留言联系 事务的隔离级别 (由高到低)1.串行化(serializable):一个事务一个事务的执行2.可重复读(Repeatable-Read) 可重复读,无论其他事务是否修改并提交 ...
- MySQL事务隔离级别测试实例
https://www.cnblogs.com/huanongying/p/7021555.html MySQL事务隔离级别 事务隔离级别 脏读 不可重复读 幻读 读未提交(read-uncommit ...
- Mysql事务-隔离级别
MYSQL事务-隔离级别 事务是什么? 事务简言之就是一组SQL执行要么全部成功,要么全部失败.MYSQL的事务在存储引擎层实现. 事务都有ACID特性: 原子性(Atomicity):一个事务必须被 ...
随机推荐
- 【Oracle 12c】CUUG OCP认证071考试原题解析(32)
32.choose the best answer View the Exhibit and examine the data in EMP and DEPT tables. In the DEPT ...
- Linux中tail指令详解
linux tail命令用途是依照要求将指定的文件的最后部分输出到标准设备,通常是终端,通俗讲来,就是把某个档案文件的最后几行显示到终端上,假设该档案有更新,tail会自己主动刷新,确保你看到最新的档 ...
- Linux下查找命令
在CentOs下查找某个目录下的某个文件,使用如下指令: find /目录 -name 文件名 eg:查找当前目录下关于hadoop的文件 find / -name hadoop
- [Swift实际操作]八、实用进阶-(1)Swift语言中的两种单例模式实际操作
本文降温你解析常见的单例模式.单例模式可以保证一个类仅有一个实例,同时这个类还必须提供一个访问该类的全局访问点. 首先导入需要使用到的界面工具框架 import UIKit 单例对象保证了只有一个实例 ...
- RHEL 7 下内存管理小记
RHEL 7 下内存管理小记 一.Overview 众所周知,在 Linux 操作系统中有三个目录非常有趣好玩. /dev /run /proc 一个个解释下,/dev 用于对特殊设备(BTW:特殊设 ...
- scrapy实战1,基础知识回顾和虚拟环境准备
视频地址 https://coding.imooc.com/learn/list/92.html 一. 基础知识回顾 1. 正则表达式 1)贪婪匹配,非贪婪匹配 .*? 非贪婪 . ...
- 递归实现进制转换(C++版)
上次呢,我们留下了一道题,今天我们来一起看一看: 题目链接:https://www.cnblogs.com/gaozirong/p/10547434.html 这是我写的程序,大家可以对照参考一下(C ...
- TX2 i2c-tools使用
安装: apt-get install libi2c-dev i2c-tools 检测i2c总线数目 用i2cdetect检测有几组i2c总线在系统上: i2cdetect -l 可以看到系统中有9组 ...
- Django分页的实现
Django分页的实现 Django ORM 分页介绍 分页是网页浏览中常见到的一种形式,在数据量较大时,一个页面显示不全,采取分割数据由用户选择进行显示的方式. 基本实现 技术点 通过切片得到数据 ...
- (转)Linux下部署tomcat及tomcat war包应用程序
原文:http://www.cnblogs.com/smallfa/news/2017/07/17/7193620.html 1, 通过winscp将tomcat包(6和7版本都是一样的安装方法)和j ...