MySQL 锁

MySQL 锁

数据库锁设计初衷是处理并发问题,在多线程执行情况下保证最终结果如预期

可以通过 select * from sys.innodb_lock_waits; 查看被阻塞的事务

两阶段锁协议

两阶段锁协议:在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放

事务在执行的时候,并不是一次性把所有行锁都持有,而是执行到哪一行就拿哪一行的锁,等到最后 commit 的时候,一起释放

锁分类

不同锁之间的兼容性:

MySQL 锁_第1张图片

行级锁

共享锁(S Lock)和排他锁(X Lock)

S 锁 允许事务读一行数据

X 锁 允许事务删除或更新一行数据

表级锁

意向锁(Intention Locks)

意向锁是为了 InnoDB 允许持有事务多种粒度的锁而设计的,允许在一行上同时持有表锁和行锁

意向锁一共有两种类型:

  1. 意向共享锁(IS):想要获取一张表中某几行 S 锁,可以通过 SELECT ... FOR SHARE 设立
  2. 意向排它锁(IX):想要获取一张表中某几行 X 锁,可以通过 SELECT ... FOR UPDATE 设立

记录锁(Record Locks)

单个行记录的锁,总是会锁定索引记录,如果创立表时没有设置索引,就会锁定隐式创建的主键

例如:SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE; 会阻止任何事务更新、删除、修改该行数据

间隙锁(Gap Locks)

锁定一个范围,不包含记录本身,在可重复读隔离级别下才会生效,相同区间的间隙锁之间是不互斥的

例如:SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 FOR UPDATE; 会阻止任何事务修改 [10,20] 之间的记录

where 条件全部精确命中(=或者in)只会添加记录锁,

临键锁(Next-Key Locks)

Record Locks + Gap Locks ,锁定一个范围(前开后闭),并锁定记录本身

你可能感兴趣的:(mysql)