MySQL 锁
数据库锁设计初衷是解决并发问题,在多线程执行状况下保障最终后果如预期
能够通过 select * from sys.innodb_lock_waits;
查看被阻塞的事务
两阶段锁协定
两阶段锁协定:在 InnoDB 事务中,行锁是在须要的时候才加上的,但并不是不须要了就立即开释,而是要等到事务完结时才开释
事务在执行的时候,并不是一次性把所有行锁都持有,而是执行到哪一行就拿哪一行的锁,等到最初 commit 的时候,一起开释
锁分类
不同锁之间的兼容性:
行级锁
共享锁(S Lock)和排他锁(X Lock)
S 锁 容许事务读一行数据
X 锁 容许事务删除或更新一行数据
表级锁
意向锁(Intention Locks)
意向锁是为了 InnoDB 容许持有事务多种粒度的锁而设计的,容许在一行上同时持有表锁和行锁
意向锁一共有两种类型:
- 动向共享锁(IS):想要获取一张表中某几行 S 锁,能够通过
SELECT ... FOR SHARE
设立 - 动向排它锁(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,锁定一个范畴(前开后闭),并锁定记录自身