我们都知道mysql 一共有四种隔离级别
可重复读隔离级别下的幻读问题
-
可重复读又分为快照读 和 幻读
-
快照读不会产出幻读问题
-
普通 select 语句
-
当前读会产生幻读问题
-
select … lock in share mode
-
select … for update
-
for update 表明需要看到最新的数据
-
update 、delete 、insert
-
for update 锁表还是锁行?
-
当条件列有索引时锁行否则锁表
-
啥是幻读?
-
事物里边两个查询语句 前一次执行和后一次查询结果不行
-
复现(假设d=5 只会锁住一行,假设假设!!重要的事情说3遍)
| SessionA | 事物B |
-------------------------------------------
begin
-------------------------------------------------------------
select * from t where d=5 for update |
result(5,5,5)
-------------------------------------------------------------
|update t set d=5 where id =0
-------------------------------------------------------------
select * from t where d=5 for update |
result(0,0,5) (5,5,5)
-------------------------------------------------------------
-
- # 我们可以清楚的看到由于事物B 修改了一条id=0 所以导致同一个事物中两次查询不一致
# 那么mysql是如何解决这个问题的?
-# mysql 引入了间隙锁
- 间隙锁不止锁住该行数据,还有锁住该值的间隙
- 举例
假设该表有如下数据
- d 列值分别为1 5 10
- select * from t where d=5 for update
- 会锁住d=5 该行和 d=[1-10] 这个区间的值