三、事务
1. 事务是什么?
事务是一组不可分割的数据库操作集合,要么全部执行成功,要么全部失败回滚,保证数据的一致性。
2.事务的四大特性:ACID(死记硬背)
A 原子性(Atomicity)
不可分割,要么全成功,要么全回滚。
C 一致性(Consistency)
事务前后,数据的完整性不变(合法、正确)。
I 隔离性(Isolation)
多个事务之间互不干扰。
D 持久性(Durability)
事务一旦提交,数据永久保存,宕机也不丢。别(由低到高)
3.四大事务隔离级
· 读未提交 (Read Uncommitted):可读到未提交数据,脏读、不可重复读、幻读都存在
· 读已提交 (Read Committed):解决脏读,存在不可重复读、幻读(Oracle 默认)
· 可重复读 (Repeatable Read):MySQL 默认级别,解决脏读、不可重复读,存在幻读
· 串行化 (Serializable):最高级别,全部问题解决,性能最差
4.三大读问题
· 脏读:读到其他事务未提交的数据
· 不可重复读:同一事务内,两次读同一数据结果不同(其他事务更新提交)
· 幻读:同一事务内,范围查询,其他事务插入 / 删除新数据,出现新行
5.InnoDB 如何实现隔离级别
依靠 MVCC(多版本并发控制) + 锁实现。
四、MVCC 多版本并发控制(InnoDB 核心)
1. 什么是MVCC?
MVCC 全称 Multi-Version Concurrency Control,多版本并发控制。
它是 MySQL InnoDB 存储引擎实现事务隔离的核心机制,不用加锁,就能让多个事务同时读写数据库,互相不阻塞,大幅提升数据库并发性能。
简单说:MVCC 就是给数据存多个 “历史版本”,让不同事务读自己能看见的版本,实现读写不冲突、无锁并发。
2. 为什么需要 MVCC?
数据库并发场景有三种:
读 - 读:无冲突,不需要处理
读 - 写:有冲突,容易出现脏读、不可重复读、幻读
写 - 写:有冲突,需要加锁
传统方案解决读 - 写冲突会加锁(比如行锁、表锁),但加锁会导致:
一个事务写数据时,其他事务必须等待
并发性能极差,高并发场景会卡死
MVCC 用 “多版本” 替代 “加锁”,完美解决读 - 写冲突,实现无锁并发。
五、锁
一、锁基础(必背)
1.锁的作用:解决并发事务下的数据安全问题(脏写、丢失更新)。
2. MySQL 锁层级:
· 全局锁:锁整个数据库实例
· 表级锁:锁整张表
· 行级锁:锁某一行数据
3.锁粒度越小,并发越高: 行锁 < 表锁 < 全局锁
4. 锁类型核心分类:
· 共享锁(S 锁 / 读锁):读加锁,共享兼容,互斥排他锁
·排他锁(X 锁 / 写锁):写加锁,完全互斥
5.适用引擎:
·MyISAM:只支持表锁
·InnoDB:支持表锁 + 行锁 + 间隙锁(面试重点)
二、快照读 & 当前读(锁必考)
1.快照读
普通 SELECT
不加锁,基于 MVCC
2.当前读
INSERT/UPDATE/DELETE/SELECT ... FOR UPDATE
加锁,读最新数据
三、死锁(面试重点)
1.死锁定义:两个事务互相持有对方需要的锁,循环等待
2.死锁 4 个必要条件
互斥
请求与保持
不可剥夺
循环等待
3.死锁解决策略
超时等待(innodb_lock_wait_timeout)
死锁检测(主动回滚代价小的事务)
4.如何避免死锁(背诵)
按固定顺序访问表 / 行
事务尽快提交,不要大事务
合理加索引,避免锁升级
降低隔离级别(RC)
事务、MVCC、锁的知识点
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法