使用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的隔离级别总结的更多相关文章

  1. mysql 数据库隔离级别

    select @@tx_isolation; 4种隔离级别 1.read uncommitted 2.read committed 3.repeatable read(MySQL默认隔离级别) 4.  ...

  2. mysql事务隔离级别和MVCC

    一.三种问题: 脏读(Drity Read):事务A更新记录但未提交,事务B查询出A未提交记录. 不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次 ...

  3. Mysql得隔离级别

    一.首先什么是事务? 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事 ...

  4. Mysql的隔离级别

    一.首先什么是事务? 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事 ...

  5. [51CTO]新说MySQL事务隔离级别!

    新说MySQL事务隔离级别! 事务隔离级别这个问题,无论是校招还是社招,面试官都爱问!然而目前网上很多文章,说句实在话啊,我看了后我都怀疑作者弄懂没!本文所讲大部分内容,皆有官网作为佐证,因此对本文内 ...

  6. 查询mysql事务隔离级别

    查询mysql事务隔离级别 查询mysql事务隔离级别 分类: DB2011-11-26 13:12 2517人阅读 评论(0) 收藏 举报 mysqlsessionjava   1.查看当前会话隔离 ...

  7. mysql 事务隔离级别详解

    事物的 隔离级别,说简单非常简单(新手也能说出 是个隔离级别 和 影响),说男也非常难.(很多 有几年编程 经验的程序员依旧搞不清楚) 废话不多少 直接开始: 事务的隔离级别 是用来描述 事务的读关系 ...

  8. mysql数据库隔离级别

    # 原创,转载请留言联系 事务的隔离级别 (由高到低)1.串行化(serializable):一个事务一个事务的执行2.可重复读(Repeatable-Read) 可重复读,无论其他事务是否修改并提交 ...

  9. MySQL事务隔离级别测试实例

    https://www.cnblogs.com/huanongying/p/7021555.html MySQL事务隔离级别 事务隔离级别 脏读 不可重复读 幻读 读未提交(read-uncommit ...

  10. Mysql事务-隔离级别

    MYSQL事务-隔离级别 事务是什么? 事务简言之就是一组SQL执行要么全部成功,要么全部失败.MYSQL的事务在存储引擎层实现. 事务都有ACID特性: 原子性(Atomicity):一个事务必须被 ...

随机推荐

  1. 【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 ...

  2. Linux中tail指令详解

    linux tail命令用途是依照要求将指定的文件的最后部分输出到标准设备,通常是终端,通俗讲来,就是把某个档案文件的最后几行显示到终端上,假设该档案有更新,tail会自己主动刷新,确保你看到最新的档 ...

  3. Linux下查找命令

    在CentOs下查找某个目录下的某个文件,使用如下指令: find /目录 -name 文件名 eg:查找当前目录下关于hadoop的文件 find / -name hadoop

  4. [Swift实际操作]八、实用进阶-(1)Swift语言中的两种单例模式实际操作

    本文降温你解析常见的单例模式.单例模式可以保证一个类仅有一个实例,同时这个类还必须提供一个访问该类的全局访问点. 首先导入需要使用到的界面工具框架 import UIKit 单例对象保证了只有一个实例 ...

  5. RHEL 7 下内存管理小记

    RHEL 7 下内存管理小记 一.Overview 众所周知,在 Linux 操作系统中有三个目录非常有趣好玩. /dev /run /proc 一个个解释下,/dev 用于对特殊设备(BTW:特殊设 ...

  6. scrapy实战1,基础知识回顾和虚拟环境准备

        视频地址 https://coding.imooc.com/learn/list/92.html   一. 基础知识回顾     1. 正则表达式 1)贪婪匹配,非贪婪匹配 .*? 非贪婪 . ...

  7. 递归实现进制转换(C++版)

    上次呢,我们留下了一道题,今天我们来一起看一看: 题目链接:https://www.cnblogs.com/gaozirong/p/10547434.html 这是我写的程序,大家可以对照参考一下(C ...

  8. TX2 i2c-tools使用

    安装: apt-get install libi2c-dev i2c-tools 检测i2c总线数目 用i2cdetect检测有几组i2c总线在系统上: i2cdetect -l 可以看到系统中有9组 ...

  9. Django分页的实现

    Django分页的实现 Django ORM  分页介绍 分页是网页浏览中常见到的一种形式,在数据量较大时,一个页面显示不全,采取分割数据由用户选择进行显示的方式. 基本实现 技术点 通过切片得到数据 ...

  10. (转)Linux下部署tomcat及tomcat war包应用程序

    原文:http://www.cnblogs.com/smallfa/news/2017/07/17/7193620.html 1, 通过winscp将tomcat包(6和7版本都是一样的安装方法)和j ...