MySQL白菜教程(Level 10 - 意向锁&记录锁&间隙锁)

意向锁(Intention Locks; table-level lock)
意向锁是一种特殊的表级锁,意向锁是为了让 InnoDB 多粒度的锁能共存而设计的。取得行的共享锁和排他锁之前需要先取得表的意向共享锁(IS)和意向排他锁(IX),意向共享锁和意向排他锁都是系统自动添加和自动释放的,整个过程无需人工干预

意向锁就是指未来的某一个时刻事务可能要加共享锁或者排它锁,提前声明一个意向,分为两种:

意向共享锁(Intention Shared Lock) IS
事务有意向对表中的某些行加共享锁(S锁)

SELECT column FROM table ... LOCK IN SHARE MODE;

意向排它锁(Intention Exclusive Lock)IX
事务有意向对表中的某些行加排他锁(X锁)

SELECT column FROM table ... FOR UPDATE;

记录锁(Record Locks)
官方原文

A record lock is a lock on an index record. For example, SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE; prevents any other transaction from inserting, updating, or deleting rows where the value of t.c1 is 10.

SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE;这一行则是使用了记录锁,不允许其他事务进行增,删,改
但是 SELECT c1 FROM t WHERE c1 = 10;是没有锁的,走的是快照读,上文已经阐明过了
记录锁本身不是锁定记录数据本身而是锁定索引记录,如果要锁的列没有索引,则会进行全表记录加锁

间隙锁(Gap Locks)
官方原文

A gap lock is a lock on a gap between index records, or a lock on the gap before the first or after the last index record. For example, SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 FOR UPDATE; prevents other transactions from inserting a value of 15 into column t.c1, whether or not there was already any such value in the column, because the gaps between all existing values in the range are locked.

比如 SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 FOR UPDATE;
插入 c1 为 15 的记录会被锁定不可执行
这种默认存在于可重复读的事务隔离级别中的锁,锁定被圈定的范围不允许 insert,防止不可重复读,上文说了我们的事务隔离级别都是读已提交,默认会产生不可重复读的问题

你可能感兴趣的:(MySQL白菜教程(Level 10 - 意向锁&记录锁&间隙锁))