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 的记录就不是唯一的了

相关推荐
. . . . .12 分钟前
乐观锁 vs 悲观锁
数据库·sql
hasty1 小时前
Origin 校验不是身份认证:MySQL MCP Server 漏洞给 AI 平台的警告
数据库·mysql·安全
JavaPub-rodert4 小时前
Docker 安装 MySQL 完整教程:从零部署数据库,到生产环境持久化配置
数据库·mysql·docker
隔窗听雨眠4 小时前
MySQL整库迁移至KaiwuDB完全指南:从数据类型映射到生产切换的系统性实践
数据库·mysql
2301_32241428045 小时前
活力孕康复APP 47737- 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·mysql·微信小程序·idea·微信开发者工具
勤奋的树懒5 小时前
从手写 SQL 到 Windows 工具:致远 OA 文件清理实践
数据库·sql·windows server·致远oa
YIAN9 小时前
手撸社区后端:一套可落地的用户 - 文章 - 互动体系 MySQL 表设计与优化思路
后端·mysql
码农学院9 小时前
零售电商GEO踩坑复盘:把 MySQL 商品库自动映射成 Product Schema 的完整方案
人工智能·mysql·零售·geo
cspttty12 小时前
2026秋招供应链分析师技能栈:SQL、Excel、BI与业务分析
数据库·sql·excel
ShineWinsu12 小时前
对于MySQL:索引的解析
linux·数据库·mysql·面试·笔试·索引·海量数据