Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL 事务的隔离级别

MySQL 事务的隔离级别

作者头像
lin_zone
发布于 2020-04-17 02:44:32
发布于 2020-04-17 02:44:32
1.2K00
代码可运行
举报
文章被收录于专栏:LIN_ZONELIN_ZONE
运行总次数:0
代码可运行
  1. MySQL 事务隔离级别查看及修改 参考:mysql修改事务隔离级别
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT @@global.tx_isolation; 						
SELECT @@session.tx_isolation; 							
SELECT @@tx_isolation; 
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
代码语言:txt
AI代码解释
复制
1.  注意:默认的行为(不带session和global)是为下一个(未开始)事务设置隔离级别。如果你使用GLOBAL关键字,语句在全局对从那点开始创建的所有新连接(除了不存在的连接)设置默认事务级别。你需要SUPER权限来做这个。使用SESSION 关键字为将来在当前连接上执行的事务设置默认事务级别。 任何客户端都能自由改变会话隔离级别(甚至在事务的中间),或者为下一个事务设置隔离级别。
  1. MySQL 事务的隔离级别及每种隔离级别存在的问题 参考:深入理解MySQL的四种隔离级别及加锁实现原理
代码语言:txt
AI代码解释
复制
1.  事务的四大特性
代码语言:txt
AI代码解释
复制
    1.  原子性 ( Atomicity ) 事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做
 
代码语言:txt
AI代码解释
复制
    2.  一致性 ( Consistency ) 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。也就是说数据库中只包含成功事务提交的结果
 
代码语言:txt
AI代码解释
复制
    3.  隔离性  ( Isolation ) 并发执行的各个事务之间不会互相干扰
 
代码语言:txt
AI代码解释
复制
    4.  持久性   ( Durability ) 指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的
 
代码语言:txt
AI代码解释
复制
2.  事务的隔离级别
代码语言:txt
AI代码解释
复制
    1.  **Read Uncommitted(读未提交)** 所有事务都可以看到其他未提交事务的执行结果,会产生脏读(读取未提交的数据)
 
代码语言:txt
AI代码解释
复制
    2.  **Read Committed(读提交)** 一个事务只能看见已经提交事务所做的改变,会产生不可重复读问题
 
代码语言:txt
AI代码解释
复制
    3.  **Repeatable Read(可重读)** 这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)
 
代码语言:txt
AI代码解释
复制
    4.  **Serializable(串行化)** 这是最高的隔离级别,读加共享锁,写加排他锁,读写互斥,从而解决幻读问题。在这个级别,可能导致大量的超时现象和锁竞争,如果业务并发的特别少,同时又要求数据及时可靠的话,可以使用。
 
代码语言:txt
AI代码解释
复制
3.  隔离级别产生的问题
代码语言:txt
AI代码解释
复制
    1. 脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据不正确了
    2. 不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。
    3. 幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。

读未提交 可能会导致 脏读、不可重复读、幻读

读提交 可能会导致 不可重复读、幻读

可重读 可能会导致 幻读

代码语言:txt
AI代码解释
复制
1.  事务的加锁机制
代码语言:txt
AI代码解释
复制
    1.  一次封锁 和 两段锁协议
代码语言:txt
AI代码解释
复制
        1.  一次封锁,在方法的开始阶段,已经预先知道会用到哪些数据,然后全部锁住,在方法运行之后,再全部解锁。这种方式不会产生循环死锁的问题,但数据库中在事务开始阶段,数据库并不知道会用到哪些数据,所以在数据库中不适用。
代码语言:txt
AI代码解释
复制
        2.  两段锁协议 将事务分为 加锁阶段 和 解锁阶段
 
代码语言:txt
AI代码解释
复制
            1.  加锁阶段,在这个阶段只能进行加锁,读操作加共享锁,写操作加排它锁,有时候删除和插入操作会加区间锁
代码语言:txt
AI代码解释
复制
            2.  解锁阶段,当事务释放了一个封锁以后,事务进入解锁阶段,在该阶段只能进行解锁操作不能再进行加锁操作。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
事务                加锁/解锁处理

  begin;

  insert into test .....    # 加insert对应的锁

  update test set...      # 加update对应的锁

  delete from test ....  # 加delete对应的锁

				commit;                # 事务提交时,同时释放																insert、update、delete对应的锁

这种方式虽然无法避免死锁(当事务A先需要资源1然后需要资源2, 事务B 先需要资源2然后需要资源1),但是两段锁协议可以保证事务的并发调度是串行化

代码语言:txt
AI代码解释
复制
    1.  悲观锁和乐观锁
代码语言:txt
AI代码解释
复制
        1.  悲观锁:往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。 在悲观锁的情况下,为了保证事务的隔离性,就需要一致性锁定读。读取数据时给加锁,其它事务无法修改这些数据。修改删除数据时也要加锁,其它事务无法读取这些数据。
 在MySQL InnoDB 中 RR 级别下,悲观锁加的是 next-Key锁
 
代码语言:txt
AI代码解释
复制
        2.  乐观锁:基于数据版本( Version )记录机制实现。为数据增加一个版本标识,读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。
代码语言:txt
AI代码解释
复制
    2.  MVCC 的实现 在InnoDB中,会在每行数据后添加两个额外的隐藏的值来实现MVCC,这两个值一个记录这行数据何时被创建,另外一个记录这行数据何时过期(或者被删除)。 在实际操作中,存储的并不是时间,而是事务的版本号,每开启一个新事务,事务的版本号就会递增。 在可重读Repeatable reads事务隔离级别下: SELECT时,读取创建版本号<=当前事务版本号,删除版本号为空或>当前事务版本号。 INSERT时,保存当前事务版本号为行的创建版本号。 DELETE时,保存当前事务版本号为行的删除版本号。 UPDATE时,插入一条新纪录,保存当前事务版本号为行创建版本号,同时保存当前事务版本号到原来删除的行。 通过MVCC,虽然每行记录都需要额外的存储空间,更多的行检查工作以及一些额外的维护工作,但可以减少锁的使用,大多数读操作都不用加锁,读数据操作很简单,性能很好,并且也能保证只会读取到符合标准的行,也只锁住必要行。
 在MVCC中 为了减少锁处理(包括等待其它锁)的时间,提升并发能力,引入了快照读(读取历史数据)的概念,使得select不用加锁。
 写(当前读):为了幻读问题,MySQL事务使用了Next-Key锁。Next-Key锁是行锁和GAP(间隙锁)的合并,行锁防止别的事务修改或删除,GAP锁防止别的事务新增。
 

注:如需转载,请注明出处:https://cloud.tencent.com/developer/article/1615842

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-04-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
搞懂MySQL的锁、MVCC、事务隔离级别,看这篇就够了!
在如今互联网业务中使用范围最广的数据库无疑还是关系型数据库MySQL,之所以用"还是"这个词,是因为最近几年国内数据库领域也取得了一些长足进步,例如以TIDB、OceanBase等为代表的分布式数据库,但它们暂时还没有形成绝对的覆盖面,所以现阶段还得继续学习MySQL数据库以应对工作中遇到的一些问题,以及面试过程中关于数据库部分的考察。
用户5927304
2021/09/14
2.3K0
搞懂MySQL的锁、MVCC、事务隔离级别,看这篇就够了!
深入理解 MySQL 事务:隔离级别、ACID 特性及其实现原理
事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元。事务通常由高级数据库操作语言或编程语言(如 SQL,C++ 或 Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全部操作组成。
CG国斌
2022/05/06
5450
深入理解 MySQL 事务:隔离级别、ACID 特性及其实现原理
锁是理解隔离级别的钥匙
说到数据库的隔离级别,我们好像都知道,但是好像又搞不清各种隔离级别之间真正的区别,以前我从网上看了很多文章,当时是觉得看懂了,但是没过多久又忘了,然后又要花大量的时间去重新理解。
zhanyd
2022/05/16
5070
锁是理解隔离级别的钥匙
MySql避坑指南:可重复读隔离级别下,并发情况下更新丢失问题避坑
解决并发问题,当然锁最靠谱,所以MySql也提了共享锁、排它锁等。但是一个并发性能良好的系统一旦加锁,不可避免的造成访问的串行化,影响并发性能。所以MySql提供了一种乐观锁的实现:MVCC(多版本并发控制),来解决读-写并发不加锁。
崔认知
2023/06/20
3.7K2
MySql避坑指南:可重复读隔离级别下,并发情况下更新丢失问题避坑
mysql 锁机制与四种隔离级别
工作中使用 mysql 比较多,mysql 之所以在业内具有如此崇高的地位,与他严密的加解锁逻辑也是分不开的。 本文进行了一番总结。
用户3147702
2022/06/27
8770
mysql 锁机制与四种隔离级别
mysql事务隔离级别与MVCC
事务A和事务B都读取了同一行数据, 比如原数据行的值是100,事务A是将数值读取出来+1并更新, 事务B是读取数值+2并更新。当事务A和事务B都读取到了100,事务A首先完成并更新为101,事务B随后完成更新成了102。这样事务B就把事务A的结果覆盖了。
leobhao
2022/06/28
4170
mysql事务隔离级别与MVCC
快速理解脏读、不可重复读、幻读和MVCC
A事务读取B事务尚未提交的数据,此时如果B事务发生错误并执行回滚操作,那么A事务读取到的数据就是脏数据。就好像原本的数据比较干净、纯粹,此时由于B事务更改了它,这个数据变得不再纯粹。这个时候A事务立即读取了这个脏数据,但事务B良心发现,又用回滚把数据恢复成原来干净、纯粹的样子,而事务A却什么都不知道,最终结果就是事务A读取了此次的脏数据,称为脏读。
互扯程序
2019/06/25
66.1K14
快速理解脏读、不可重复读、幻读和MVCC
【转】Innodb中的事务隔离级别和锁的关系一次封锁or两段锁?事务中的加锁方式参考资料
因为有大量的并发访问,为了预防死锁,一般应用中推荐使用一次封锁法,就是在方法的开始阶段,已经预先知道会用到哪些数据,然后全部锁住,在方法运行之后,再全部解锁。这种方式可以有效的避免循环死锁,但在数据库中却不适用,因为在事务开始阶段,数据库并不知道会用到哪些数据。
阿杜
2018/08/06
5940
【转】Innodb中的事务隔离级别和锁的关系一次封锁or两段锁?事务中的加锁方式参考资料
MySQL事务以及隔离级别
我一直想不到一个好的标题应该怎么写。我想MySQL的一些重要的内容。我在两次面试中都遇到过的,但直接用MySQL标题好像又不太贴切。干脆就是所写的内容吧。
星哥玩云
2022/08/16
4500
MySQL事务(一)MySQL事务隔离级别、锁机制
数据库通常会同时执行多个事务,这些事务可能同时对同一批数据进行增删改查操作,可能会导致脏写、脏读、不可重复读和幻读等问题。
鳄鱼儿
2024/05/21
1.5K0
MySQL事务(一)MySQL事务隔离级别、锁机制
MySQL数据库的事务隔离和MVCC
事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)的缩写,这四种状态的意思是:
数据和云
2019/05/13
1.2K0
MySQL数据库的事务隔离和MVCC
MySQL(二)|深入理解MySQL的四种隔离级别及加锁实现原理
注:内容有点干,但希望你可以耐心地看完。回头我写一篇实操的文章帮助理解。 开发工作中我们会使用到事务,那你们知道事务又分哪几种吗? 以及不同事务隔离的加锁实现原理是什么? 一、首先什么是事务? 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。 事务的结束有两种,当事务中的所有步骤全部成功执行时,事务提交。如果其中一个步骤失败,将发生回滚操作,撤消事务开始时的所有操作。 二、事
黄小怪
2018/05/21
3K1
MySQL事务的隔离级别
若此时A客户端rollback了,数据库中zhangsan的年龄恢复成了20,那这时候已经来不及了,B客户端拿着年龄21去做业务了
终有救赎
2023/11/08
3790
MySQL事务的隔离级别
MySQL系列-高级-深入理解Mysql事务隔离级别与锁机制02
我们的数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。 这些问题的本质都是数据库的多事务并发问题,为了解决多事务并发问题,数据库设计了事务隔离机制、锁机制、MVCC多版本并发控制隔离机制,用一整套机制来解决多事务并发问题。接下来,我们会深入讲解这些机制,让大家彻底理解数据库内部的执行原理。
IT从业者张某某
2022/11/12
4340
MySQL系列-高级-深入理解Mysql事务隔离级别与锁机制02
读懂MySQL事务隔离
假设一个银行的数据库有两张表:支票表(checking)和储蓄表(savings)。现在要从张三的账户转移200元到他的储蓄账户,那么需要至少三个步骤。
不惑
2024/01/16
4420
读懂MySQL事务隔离
重新学习MySQL数据库9:Innodb中的事务隔离级别和锁的关系
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
Java技术江湖
2019/11/29
5050
关于MySQL事务隔离级别
MySQL遵循SQL:1992标准,提供READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ和SERIALIZABLE四种事务隔离级别。InnoDB默认使用的事务隔离级别是REPEATABLE READ。
星哥玩云
2022/08/16
7370
MySQL事务隔离级别的实现原理
在MySQL的众多存储引擎中,只有InnoDB支持事务,所有这里说的事务隔离级别指的是InnoDB下的事务隔离级别。
allsmallpig
2021/02/25
5930
数据库的事务隔离级别总结[通俗易懂]
学习数据库的时候常常会接触到事务, ACID等概念,那么到底什么是数据库的事务,数据库事务又具有哪些特点,和ACID有怎样的关系,事务的隔离级别又是做什么的呢?。
全栈程序员站长
2022/08/27
6620
数据库的事务隔离级别总结[通俗易懂]
MySQL的四种事务隔离级别
本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB
Lansonli
2021/10/09
5360
MySQL的四种事务隔离级别
推荐阅读
相关推荐
搞懂MySQL的锁、MVCC、事务隔离级别,看这篇就够了!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验