MySQL的四种事务隔离级别

MySQL的四种事务隔离级别

本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB

一、事务的基本要素(ACID)

  1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。

   2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。

   3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。

   4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

 

二、事务的并发问题

  1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

  2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。

  3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

  小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

 

三、MySQL事务隔离级别

事务隔离级别 脏读 不可重复读 幻读
读未提交(read-uncommitted) 是 是 是
不可重复读(read-committed) 否 是 是
可重复读(repeatable-read) 否 否 是
串行化(serializable) 否 否 否

 

 

 

 

 

mysql默认的事务隔离级别为repeatable-read

MySQL的四种事务隔离级别

 

四、用例子说明各个隔离级别的情况

  1、读未提交:

    (1)打开一个客户端A,并设置当前事务模式为read uncommitted(未提交读),查询表account的初始值:

 MySQL的四种事务隔离级别

    (2)在客户端A的事务提交之前,打开另一个客户端B,更新表account:

 MySQL的四种事务隔离级别

 

    (3)这时,虽然客户端B的事务还没提交,但是客户端A就可以查询到B已经更新的数据:

 MySQL的四种事务隔离级别

    (4)一旦客户端B的事务因为某种原因回滚,所有的操作都将会被撤销,那客户端A查询到的数据其实就是脏数据:

 MySQL的四种事务隔离级别

     (5)在客户端A执行更新语句update account set balance = balance – 50 where id =1,lilei的balance没有变成350,居然是400,是不是很奇怪,数据不一致啊,如果你这么想就太天真 了,在应用程序中,我们会用400-50=350,并不知道其他会话回滚了,要想解决这个问题可以采用读已提交的隔离级别

MySQL的四种事务隔离级别

 

  2、读已提交

    (1)打开一个客户端A,并设置当前事务模式为read committed(未提交读),查询表account的所有记录:

 MySQL的四种事务隔离级别

    (2)在客户端A的事务提交之前,打开另一个客户端B,更新表account:

 MySQL的四种事务隔离级别

    (3)这时,客户端B的事务还没提交,客户端A不能查询到B已经更新的数据,解决了脏读问题:

 MySQL的四种事务隔离级别

    (4)客户端B的事务提交

MySQL的四种事务隔离级别

    (5)客户端A执行与上一步相同的查询,结果 与上一步不一致,即产生了不可重复读的问题

MySQL的四种事务隔离级别

 

   3、可重复读

     (1)打开一个客户端A,并设置当前事务模式为repeatable read,查询表account的所有记录

MySQL的四种事务隔离级别

    (2)在客户端A的事务提交之前,打开另一个客户端B,更新表account并提交

MySQL的四种事务隔离级别

    (3)在客户端A查询表account的所有记录,与步骤(1)查询结果一致,没有出现不可重复读的问题

MySQL的四种事务隔离级别

    (4)在客户端A,接着执行update balance = balance – 50 where id = 1,balance没有变成400-50=350,lilei的balance值用的是步骤(2)中的350来算的,所以是300,数据的一致性倒是没有被破坏。可重复读的隔离级别下使用了MVCC机制,select操作不会更新版本号,是快照读(历史版本);insert、update和delete会更新版本号,是当前读(当前版本)。

MySQL的四种事务隔离级别

(5)重新打开客户端B,插入一条新数据后提交

MySQL的四种事务隔离级别

(6)在客户端A查询表account的所有记录,没有 查出 新增数据,所以没有出现幻读

MySQL的四种事务隔离级别

 

  4.串行化

    (1)打开一个客户端A,并设置当前事务模式为serializable,查询表account的初始值:

复制代码
mysql> set session transaction isolation level serializable; Query OK, 0 rows affected (0.00 sec) mysql> start transaction; Query OK, 0 rows affected (0.00 sec) mysql> select * from account; +------+--------+---------+ | id | name | balance | +------+--------+---------+ | 1 | lilei | 10000 | | 2 | hanmei | 10000 | | 3 | lucy | 10000 | | 4 | lily | 10000 | +------+--------+---------+ 4 rows in set (0.00 sec)
复制代码

    (2)打开一个客户端B,并设置当前事务模式为serializable,插入一条记录报错,表被锁了插入失败,mysql中事务隔离级别为serializable时会锁表,因此不会出现幻读的情况,这种隔离级别并发性极低,开发中很少会用到。

复制代码
mysql> set session transaction isolation level serializable; Query OK, 0 rows affected (0.00 sec) mysql> start transaction; Query OK, 0 rows affected (0.00 sec) mysql> insert into account values(5,'tom',0); ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
复制代码

 

  补充:

  1、事务隔离级别为读提交时,写数据只会锁住相应的行

  2、事务隔离级别为可重复读时,如果检索条件有索引(包括主键索引)的时候,默认加锁方式是next-key 锁;如果检索条件没有索引,更新数据时会锁住整张表。一个间隙被事务加了锁,其他事务是不能在这个间隙插入记录的,这样可以防止幻读。

  3、事务隔离级别为串行化时,读写数据都会锁住整张表

   4、隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。

   5、MYSQL MVCC实现机制参考链接:https://blog.csdn.net/whoamiyang/article/details/51901888

   6、关于next-key 锁可以参考链接:https://blog.csdn.net/bigtree_3721/article/details/73731377

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/112551.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 安卓4.0/4.1/4.2手机怎么打开USB调试模式「建议收藏」

    安卓4.0/4.1/4.2手机怎么打开USB调试模式「建议收藏」提示:手机和电脑的连接方式都是ADB连接方式,所以手机上是必须打开USB调试才能正式连接和控制手机,根据安卓多个版本系统一共有3个开启USB调试模式方法。下面三个3个模式开启方法介绍::第一种模式是:

    2022年7月2日
  • mt4下载正版官网下载(如何分辨真假MT4软件)

    mt4下载正版官网下载(如何分辨真假MT4软件)在全球零售外汇行业,外汇经纪商使用最多的还是俄罗斯迈达克公司的MT4交易平台,一些不合规的外汇经纪商也对MT4十分热衷,这使市场上几千块一个的盗版MT4日益猖獗,致使一部分交易者因此遭受一些不必要的利益侵害。那么MT4。fOrex6。cc的特点是什么?如何判别一个MT4软件是否是盗版?今天就带你们辨别真假MT4.MT4的优势1.强大的工作表现MT4强大的工作表现,这一点是毋庸置疑的。MT4自2005年7月1日推出以来,就不断的获得市场的认可。下单灵活、界面友好、交易直观等这些都是MT4平台成为外汇市场

    2022年8月15日
  • PyCharm与Python的安装教程2021.11

    PyCharm与Python的安装教程2021.11文章预览:一、进入官网下载PyCharm安装包二、等待下载完成后点击进行安装三、Python安装(只介绍最新版本)四、第一个PyCharm程序五、PyCharm安装第三方库方法一、进入官网下载PyCharm安装包自行进入PyCharm官网或点击https://www.jetbrains.com/pycharm/download/#section=windows下载的是社区版,免费并且足够使用。二、等待下载完成后点击进行安装1.点击next2.选择自己要安装的目录3.勾选一些设定(1

    2022年8月28日
  • 索尼a5100微单参数_索尼微单a5100拍摄教程

    索尼a5100微单参数_索尼微单a5100拍摄教程入门的第一款微单—SONYa51002018-11-1109:33:0012点赞20收藏33评论开篇:这一刻我想将你永恒定格上帝给我我们一双黑色的眼睛,让我们用它来寻找光明。在寻找光明的途中我们发现光和影这一双神奇的上帝之手,让我们生活的环境变得那么的美好。有无数个美好的瞬间在我们眼前,多么希望将这个美好定格,留下这美丽的瞬间。正文:咔嚓之间将你定格——入门的第一款相机说到相机可谓是百家争…

    2022年11月2日
  • WLAN没有有效的IP配置如何一招解决

    WLAN没有有效的IP配置如何一招解决提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档WLAN没有有效的IP配置如何一招解决前言一、电脑连不上网?二、具体步骤1.命令提示符(管理员)输入netshwinsockreset2.重启电脑总结前言自己的笔记本原本好好的突然就连不上网了,该怎么办?别急,博主也遇到过这样的问题,并且找到一种方法,非常有用,认真看哦!一、电脑连不上网?电脑突然就连不上网,诊断以后出现这个你是否在网上看到这样的解决方案?还有这样的博主亲自尝试过,好多种方法都不管用,这里我介绍

    2022年7月11日
  • 2021CSGO_csgo靠谱交易平台

    2021CSGO_csgo靠谱交易平台2021csgo国内靠谱正规的开箱网站大全官网直达链接优惠码/推广码网站状态incsgocsgogo直接取回skinsdogcsgogo直接取回88skinscsgo直接取回skskinscsgogo直接取回npskinscsgogo直接取回fateskinscsgo直接取回yskins暂无可取回coolkaixiangcsgo直接取回piggycasecsgogo可取回box818csgo

    2022年10月5日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号