MySQL InnoDB 事务隔离级别和锁

锁类型

根据 SQL 行为,分为 2 种类型锁:

  • S 锁,共享锁
  • X 锁,排他锁

锁算法又有 2 种:

  • 行锁
  • 间隙锁

根据锁的粗粒度,还有意向锁(InnoDB事务并发决策用的,可以不用关注)

事务隔离级别和锁

根据不同方式的使用锁, MySQL 实现了 4 种事务隔离级别:

事务隔离级别
READ UNCOMMITTED(读取未提交) 无 S 锁,最新版本 有 X 锁 & 行锁
READ COMMITTED(读取已提交) 无 S 锁,最新版本或最新历史副本 有 X 锁 & 行锁
REPEATABLE READ(可重复读) 无 S 锁,指定历史副本 有 X 锁 & 行锁或间隙锁(特定语法)
SERIALIZABLE(可串行化) 有 X 锁(意向锁会参与让事务串行) 有 X 锁 & 间隙锁(意向锁会参与让事务串行)

因为锁的使用方式不同,进而可能出现以下问题:

事务隔离级别 脏读 不可重复读 幻读 丢失更新
READ UNCOMMITTED(读取未提交) Y Y Y Y
READ COMMITTED(读取已提交) N Y Y Y
REPEATABLE READ(可重复读) N N 分情况,特定语法后缀可以无幻读 Y
SERIALIZABLE(可串行化) N N N N

一致性非锁定读

READ COMMITTED(读取已提交)和REPEATABLE READ(可重复读)的读,会根据 MVCC 机制,读历史版本数据(不同的是版本的定义不同)

一致性非锁定读,性能是高效的,主要有以下 2 个方面:

  1. 并发,因为读的是历史版本数据,因此无视是否有排他锁
  2. 历史版本无额外消耗。历史版本来至事务开始前的 UNDO 记录,不是因为该功能需要额外的拷贝操作

一致性锁定读

SELECT 语句后缀:

  • SELECT ... FOR UPDATE ,显示声明加 X 锁
  • SELECT ... LOCK IN SHARE MODE ,显示声明加 S 锁

根据事务隔离级别不同,可能为行锁,或升级为间隙锁

间隙锁

间隙锁,指定索引前后区间的记录均加锁

唯一索引的 SQL 语句,根据事务隔离级别不同,可以升级为间隙锁

注意这里用词为唯一索引的记录,而没有用聚集索引

因为聚集索引可能为组合索引,这样,部分聚集索引参与的 SQL 的记录就不是唯一的了

相关推荐
poemyang1 小时前
十年大厂员工终明白:MySQL性能优化的尽头,是对B+树的极致理解
mysql·pagecache·顺序i/o·局部性原理·b tree·b+ tree
天宇_任3 小时前
Mysql数据库迁移到GaussDB注意事项
数据库·mysql·gaussdb
武昌库里写JAVA5 小时前
JAVA面试汇总(四)JVM(一)
java·vue.js·spring boot·sql·学习
老虎06277 小时前
数据库基础—SQL语句总结及在开发时
数据库·sql·oracle
花花无缺9 小时前
MySQL 的存储引擎-InnoDB 和 MyISAM的对比
mysql
苏琢玉9 小时前
如何让同事自己查数据?写一个零依赖 PHP SQL 查询工具就够了
mysql·php
Mr. zhihao9 小时前
SQL LEFT JOIN 与 WHERE 条件的隐藏坑
数据库·sql
代码的余温10 小时前
MySQL性能优化:10个关键参数调整指南
数据库·mysql·性能优化
silver988611 小时前
sql链接的url中serverTimezone的作用
数据库·sql
花花无缺11 小时前
mysql常用的基本函数
mysql