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 ,锁定一个范围(前开后闭),并锁定记录本身
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。