5.7-mysql不同隔离级别下执行sql的上锁情况-building

READ-COMMITTED级别

update where 条件为(聚簇索引 或者 普通索引 或者 非索引字段)

只会对加锁,此时没有gap锁(从information_schema.innodb_locks里查找锁信息时,显示的lock type是record)。即使where后面是范围条件也只对存在的行加锁。根源上是锁聚簇索引(主键)。

REPEATABLE READ级别

update where 条件为 非索引字段

因为此隔离级别存在gap锁,将会对全表上next-key锁。全表上锁,在所有主键上加锁,同时在所有主键的间隙中加锁!再强调一遍。

update where 非索引字段='表中不存在的值'

也会导致全表上next-key锁。

但是如果条件是主键字段又会发生什么呢?

 update where 主键 = ?

只会对符合条件的行加锁。没有gap。那执行不等于呢?

update where 主键 !=

恭喜,没有任何数据被锁。

update where 主键 范围条件

此种情况下,也只对符合条件的主键和间隙加锁。

如果是非索引字段和普通索引字段或者唯一索引字段呢?我以后慢慢补全吧,生产环境一般都是READ-COMMITTED级别吧。

总结:在rr级别下要小心。

原文地址:https://www.cnblogs.com/coolgame/p/12118736.html