上篇 MySQL 语句加锁分析
mysql学习 栏目分析MySQL语句的加锁 推荐(免费):mysql学习(视频) 事前准备 建立一个存储三国英雄的 hero 表: CREATE TABLE hero ( number INT, name VARCHAR(100), country varchar(100), PRIMARY KEY (numbe
mysql学习栏目分析MySQL语句的加锁
推荐(免费):mysql学习(视频)
事前准备
建立一个存储三国英雄的hero表:
语句加锁分析
其实啊,“XXX语句该加什么锁”本身就是个伪命题,一条语句需要加的锁受到很多条件制约,比方说:
事务的隔离级别
语句执行时使用的索引(比如聚簇索引、唯一二级索引、普通二级索引)
查询条件(比方说=、=<、>=等等)
具体执行的语句类型
在继续详细分析语句的加锁过程前,大家一定要有一个全局概念:加锁只是解决并发事务执行过程中引起的脏写、脏读、不可重复读、幻读这些问题的一种解决方案(MVCC算是一种解决脏读、不可重复读、幻读这些问题的一种解决方案),一定要意识到加锁的出发点是为了解决这些问题,不同情景下要解决的问题不一样,才导致加的锁不一样,千万不要为了加锁而加锁,容易把自己绕进去。当然,有时候因为MySQL具体的实现而导致一些情景下的加锁有些不太好理解,这就得我们死记硬背了~
我们这里把语句分为3种大类:普通的SELECT语句、锁定读的语句、INSERT语句,我们分别看一下。
普通的SELECT语句
普通的SELECT语句在:
READ UNCOMMITTED隔离级别下,不加锁,直接读取记录的最新版本,可能发生脏读、不可重复读和幻读问题。
READ COMMITTED隔离级别下,不加锁,在每次执行普通的SELECT语句时都会生成一个ReadView,这样解决了脏读问题,但没有解决不可重复读和幻读问题。
REPEATABLE READ隔离级别下,不加锁,只在第一次执行普通的SELECT语句时生成一个ReadView,这样把脏读、不可重复读和幻读问题都解决了。
不过这里有一个小插曲: