当前读:
- select...lock in share mode (共享读锁)
- select...for update
- update , delete , insert
当前读, 读取的是最新版本, 并且对读取的记录加锁, 阻塞其他事务同时改动相同记录, 避免出现安全问题.
例如, 假设要 update 一条记录, 但是另一个事务已经 delete 这条数据并且 commit 了, 如果不加锁就会产生冲突. 所以 update 的时候肯定要是当前读, 得到最新的信息并且锁定相应的记录.
当前读的实现方式: next-key 锁 (行记录锁 + Gap 间隙锁)
间隙锁: 只有在 Read Repeatable,Serializable 隔离级别才有, 就是锁定那些范围空间内的数据, 假设锁定 id>3 的数据, id 有 3,4,5, 那么 4,5 和后面的数字都会被锁定, 像 6,7..., 为什么要这样? 因为如果我们不锁定没有的数据, 当加入了新的数据 id=6, 就会出现幻读, 间隙锁避免了幻读.
对主键或唯一索引, 如果 select 查询时 where 条件全部精确命中 (= 或者 in), 这种场景本身就不会出现幻读, 所以只会加行记录锁.
来源: https://www.cnblogs.com/wwcom123/p/10727194.html