乐趣区

关于mysql:MySQL-锁

MySQL 锁

数据库锁设计初衷是解决并发问题,在多线程执行状况下保障最终后果如预期

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

两阶段锁协定

两阶段锁协定:在 InnoDB 事务中,行锁是在须要的时候才加上的,但并不是不须要了就立即开释,而是要等到事务完结时才开释

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

锁分类

不同锁之间的兼容性:

行级锁

共享锁(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,锁定一个范畴(前开后闭),并锁定记录自身

退出移动版