![](https://csdnimg.cn/release/download_crawler_static/86388201/bg4.jpg)
1. Isolation Level
隔离级别:Isolation Level,也是 RDBMS 的一个关键特性。相信对数据库有所了解的朋友,
对于 4 种隔离级别:Read Uncommited,Read Committed,Repeatable Read,Serializable,都
有了深入的认识。本文不打算讨论数据库理论中,是如何定义这 4 种隔离级别的含义的,而
是跟大家介绍一下 MySQL/InnoDB 是如何定义这 4 种隔离级别的。
MySQL/InnoDB 定义的 4 种隔离级别:
� Read Uncommited
可以读取未提交记录。此隔离级别,不会使用,忽略。
� Read Committed (RC)
快照读忽略,本文不考虑。
针对当前读,RC 隔离级别保证对读取到的记录加锁 (记录锁),存在幻读现象。
� Repeatable Read (RR)
快照读忽略,本文不考虑。
针对当前读,RR 隔离级别保证对读取到的记录加锁 (记录锁),同时保证对读取的范围加锁,
新的满足查询条件的记录不能够插入 (间隙锁),不存在幻读现象。
� Serializable
从 MVCC 并发控制退化为基于锁的并发控制。不区别快照读与当前读,所有的读操作均为当
前读,读加读锁 (S 锁),写加写锁 (X 锁)。
Serializable 隔离级别下,读写冲突,因此并发度急剧下降,在 MySQL/InnoDB 下不建议使用。
1. 一条简单 SQL 的加锁实现分析
在介绍完一些背景知识之后,本文接下来将选择几个有代表性的例子,来详细分析 MySQL
的加锁处理。当然,还是从最简单的例子说起。经常有朋友发给我一个 SQL,然后问我,这
个 SQL 加什么锁?就如同下面两条简单的 SQL,他们加什么锁?
� SQL1:select * from t1 where id = 10;
� SQL2:delete from t1 where id = 10;
针对这个问题,该怎么回答?我能想象到的一个答案是:
� SQL1:不加锁。因为 MySQL 是使用多版本并发控制的,读不加锁。
� SQL2:对 id = 10 的记录加写锁 (走主键索引)。
这个答案对吗?说不上来。即可能是正确的,也有可能是错误的,已知条件不足,这个问题
没有答案。如果让我来回答这个问题,我必须还要知道以下的一些前提,前提不同,我能给
出的答案也就不同。要回答这个问题,还缺少哪些前提条件?
� 前提一:id 列是不是主键?
� 前提二:当前系统的隔离级别是什么?