共享锁、排他锁

InnoDB 实现了两种类型的锁机制:共享锁(S)和排他锁(X)。共享锁允许一个事务读数据,不允许修改数据,如果其他事务要再对该行加锁,只能加共享锁;排他锁是修改数据时加的锁,可以读取和修改数据,一旦一个事务对该行数据加锁,其他事务将不能再对该数据加任务锁。

共享锁(S)

排它锁(X)

共享锁(S)

允许

不允许

排它锁(X)

不允许

不允许

x轴:事务A拥有的锁

y轴:事务B申请的锁

注:一个事务在某一行数据上加上排它锁后,其他事务不能再在这行数据加任何锁,无法进行 update 与 delete,但是普通的 select 是可以的,因为普通的 select 不加任何锁,当 select .... from ... for update 时才会加上排它锁。

并发事务带来的问题

1.数据丢失(两个事务同时修改一行数据,其中一个事务异常回滚,导致更新失败)

解决办法:未提交读(Read Uncommitted):在事务 B 读取数据时,事务 A 读取数据加了共享锁,修改数据时加了排它锁。这种隔离级别,会导致脏读、不可重复读以及幻读。

未提交读会导致脏读、不可重复读、幻读的原因:尽管 A 持有排它锁,避免了两个事务同时修改的情况,但是普通的 select 不持有锁,还是可以读到数据的,所以事务 A 多次修改数据,事务 B 中的查询还是可以看到的。

2.脏读(一个事务的执行期间,另一个事务读到了没有提交数据)

解决办法:已提交读(Read Committed):在事务 B 读取数据时增加了共享锁,一旦读取,立即释放锁,事务 A 读取修改数据时增加了行级排他锁,直到事务结束才释放锁。

也就是说,事务 B 在读取数据时,事务 A 只能读取数据,不能修改。当事务 B 读取到数据后,事务 A 才能修改。

这种隔离级别,可以避免脏读,但依然存在不可重复读以及幻读的问题。

已提交读会导致不可重复读、幻读的原因:事务 B 没有提交就将锁释放,导致事务 A 可以对数据进行任意修改,修改后,事务 B 再次获取共享锁查询,查询到跟之前读取不一致的数据。

3.不可重复读(一个事务的执行期间,另一个事务连续两次读取到的值不一样)

解决办法:可重复读(Repeatable Read):在事务 B 读取数据时增加了共享锁,事务结束,才释放锁,事务 A 读取修改数据时增加了行级排他锁,直到事务结束才释放锁。

也就是说,事务 B 在没有结束事务时,事务 A 只能读取数据,不能修改。当事务 B 结束事务,事务 A 才能修改。

这种隔离级别,可以避免脏读、不可重复读,但依然存在幻读的问题。

可重复读导致幻读的原因:可重复读是加的行级锁,而幻读是满足查询条件的前提下数据量发生变化,即发生 insert 或 delete操作。

4.幻读(一个事务的执行期间,另一个事务连续两次读取到的数量不同)

解决办法:可序列化(Serializable):在事务 A 读取数据时增加了共享锁,事务结束,才释放锁,事务 B 读取修改数据时增加了表级排他锁,直到事务结束才释放锁。

可序列化解决了脏读、不可重复读、幻读等问题,但隔离级别越来越高的同时,并发性会越来越低。

小结

可以看出,控制数据库并发带来的问题依赖的是锁粒度的扩大来解决的。

但是隔离级别越大,并发性就越差,如果业务场景允许的情况下,适当减小隔离级别是处理并发的一种手段。

mysql排他锁释放_Mysql 共享锁、排他锁 与 事务隔离级别详解相关推荐

  1. mysql事务实战_mysql事务隔离级别详解和实战

    A事务做了操作 没有提交 对B事务来说 就等于没做 获取的都是之前的数据 但是 在A事务中查询的话 查到的都是操作之后的数据 没有提交的数据只有自己看得到,并没有update到数据库. 查看InnoD ...

  2. mysql mvcc 读写阻塞_mysql面试题MVCC原理事务隔离级别_aiailingfei的博客-CSDN博客

    原文作者:小小一只鸟 原文标题:mysql面试题MVCC原理事务隔离级别 发布时间:2021-01-19 19:43:38 mysql事务隔离级别可重复读面试题 熊大 话说今天漂亮的妹子给我发过一张图 ...

  3. mysql 默认事务隔离级别_MySQL 事务隔离级别详解

    个人公众号『码农札记』,欢迎关注,查看更多精彩文章. 简介: MySQL的事务隔离级别一共有四个,分别是读未提交.读已提交.可重复读以及可串行化. 四个特性ACID 原子性 (Atomicity) 事 ...

  4. mysql事务隔离级别详解_MySQL的事务隔离级别详解

    事务的概念 事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的.而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句一旦执行失败或产生错误,整个单元将会回 ...

  5. MySQL 四种事务隔离级别详解及对比--转

    http://www.jb51.net/article/100183.htm 接的隔离级别.它的语法如下: ? 1 SET [SESSION | GLOBAL] TRANSACTION ISOLATI ...

  6. MYSQL事务隔离级别详解附加实验

    参考: https://dev.mysql.com/doc/refman/5.7/en/set-transaction.html http://xm-king.iteye.com/blog/77072 ...

  7. MySQL事务隔离级别详解

    SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. Read Uncommitted(读 ...

  8. 数据库事务转载基础二:MySQL事务隔离级别详解

    SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. Read Uncommitted(读 ...

  9. mysql事务隔离级别详解_高性能MySQL-详解事务与隔离级别

    本文主要包括一下内容: (1) 事务的概念与ACID (2)事务的隔离级别 (3)MySQL中的事务 1. 事务与ACID 理解事务是其它高级概念的基础.事务:事务就是一组原子性的SQL查询,或则说是 ...

  10. mysql服务器级别角色_服务器数据库系列 - MySQL事务隔离级别详解

    作者:xm_king SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. Read Un ...

最新文章

  1. 去年一个百万级的小软件项目经验分享,20来个功能模块,项目不太好做有些棘手...
  2. Java 多线程编程之 interruptException
  3. html js 添加数据类型,js数据类型判断和转换
  4. pr基本图形模板无法使用_PR模板21个时尚排版竖屏封面图形标题动画【资源分享1218】...
  5. idea安装sbt插件linux,【idea】kafkasbt+idea安装配置与测试
  6. small - HTML元素
  7. OSG/TextureCubeMap 立方贴图天空盒示例
  8. 制作Win10 U盘版移动便携系统
  9. 生成二维码如何制作二维码
  10. 惠普服务器ilo默认地址_使用ILO进行HP服务器管理的Docker容器
  11. sql盲注特点_sql盲注
  12. 计算机教师的应用计划书,教师信息技术个人提升计划
  13. 阿里云对象存储oss私有桶生成链接
  14. Apache启动报错:Apache is running a threaded MPM
  15. DS SIMULIA CST STUDIO SUITE 2021.05 SP5
  16. 电路方程的矩阵形式 c语言,电路方程的矩阵形式
  17. 诚立业科技面试经历.
  18. Redis 连接命令介绍
  19. Win极速文件搜索Listary
  20. 阅读笔记WS-DAN

热门文章

  1. 【爬虫】关于 HTTP 的 OPTIONS 请求
  2. 使用PrimeCache加速你的电脑!
  3. 打开一个网页的全过程
  4. python获得屏幕分辨率多少合适_获取显示计数和Python中的每个显示器的分辨率不xrandr...
  5. Spring技术内幕——Spring Framework的IOC容器实现(一)
  6. centos光驱安装软件
  7. 重来之大学版|学习篇-学习心态,大学生调整心态最快方法。心态好格局大,心态决定人生!
  8. Flyway 入门教程
  9. 拉卡拉支付依托“海量数据” 打造中小商户智慧经营
  10. Redis ZSet类型简介