三、事务

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)