MySQL有哪些行锁,是如何解决幻读的?

variab 2020-06-16

MySQL有哪些行锁,是如何解决幻读的?


行锁根据互斥的纬度可以分为:
    1、共享锁:当读取当一行记录时为了防止别人修改则需要添加S锁。
    2、排他锁:当修改一行记录时为了防止别人同时进行修改则需要添加X锁。


根据锁定的范围可以分为:
    1、间隙锁:间隙锁锁定范围是索引记录之间的间隙或者第一个或最后一个索引记录之前的间隙(指虚拟最大记录)
    2、记录锁:MySQL中记录锁都是添加在索引上,即使表上没有索引也会在隐藏的聚集索引上添加记录锁。
    3、next-key lock:Next-Key Locks是Record Locks与Gap Locks间隙锁的组合,也就是索引记录本身加上 之前的间隙。间隙锁防止了保证RR级别下不出现幻读现象会,防止同一个事务内得 到的结果不一致。
    4、插入意向锁:插入意向锁定是在行插入之前由INSERT操作设置的一种间隙锁。这个锁表示插入的意图,即插入相同索引间隙的多个事务如果不插入间隙内的相同位置则不需要等待彼此,插入意向锁是一种特殊的GAP LOCK。


如何解决幻读的:
    1、MySQL在RR隔离级别引入gap lock,把2条记录中间的gap锁住,避免其他事务写入(例如在二级索引上锁定记录1-3之间的gap,那么其他会话无法在这个gap间插入数据)
    2、MySQL出现幻读的条件是隔离级别<=RC,或者innodb_locks_unsafe_for_binlog=1(8.0已取消该选项)

相关推荐