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):一个事务必须被 ...
随机推荐
- Web Api 内部数据思考 和 利用http缓存优化 Api
在上篇<Web Api 端点设计 与 Oauth>后,接着我们思考Web Api 的内部数据: 其他文章:<API接口安全加强设计方法> 第一 实际使用应该返回怎样的数据 ? ...
- MySQL数据库密码破解
研究MySQL数据库的加解密方式,在网络攻防过程中具有重要的意义:试想一旦获取了网站一定的权限后,如果能够获取MySQL中保存用户数据,通过解密后,即可通过正常途径来访问数据库:一方面可以直接操作数据 ...
- ElasticSearch安装拼音插件 elasticsearch-analysis-pinyin
elasticsearch-analysis-pinyin 是 ElasticSearch的拼音插件.强大的功能支持拼音等的搜索 1.下载源代码 源码地址https://github.com/medc ...
- form表单元素的值序列化成对象
/** * 将form表单元素的值序列化成对象 * param: form jquery form对象 */ var serializeObject = function(form) { var o ...
- 私有成员的设置和访问方式——setter和getter
在定义类时,为了保证类中成员数据安全性及的封装性,防止成员数据值被任意修改,通常将类中成员属性用private进行修饰. 被private修改的成员属性,只能在类中访问,跳出本类后,就无法直接访问. ...
- 如何检查 IP是否冲突了
[root@TEST_192_168_1_252 ~]# ifconfig eth0 Link encap:Ethernet HWaddr 44:A8:42:00:1A:B5 ...
- URL中 # (hash)的含义
url中#(hash)的含义 hash 属性是一个可读可写的字符串,该字符串是 URL 的锚部分(从 # 号开始的部分) 1."#"代表网页中的一个位置.其右面的字符,就是该位置的 ...
- 半年的iOS代码生活
半年的iOS代码生活 在高考大军中拼杀过,也在大学校园中荒芜过,曾经低迷消沉,也常满怀壮志…… 但是最多的还是被称为小伙子以及自称为iOS工程师!博主就是这种喜闻乐见的这类人,实习一年后在2015年的 ...
- 简单工厂模式&策略模式-简介与区别
不得不说,这两种模式真的很像. 相似点:都用到了面向对象的继承.多态.抽象,都拥有相似的结构. 不同点:工厂模式仅提供具体的实例对象,怎么使用这个对象是client的自由,策略模式client可以通过 ...
- Go语言目录
为什么学习Go语言 第一章 环境搭建 Windows搭建Go语言环境 第二章 Go语言基础 Go语言介绍 Go语言命名 Go语言内置类型和函数 Go语言特殊函数介绍 Go语言运算符 第三章 Go语言程 ...