登录
首页 >  数据库 >  MySQL

MySQL 锁

来源:SegmentFault

时间:2023-02-24 10:00:03 451浏览 收藏

本篇文章给大家分享《MySQL 锁》,覆盖了数据库的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。

MySQL 锁

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

可以通过

select * from sys.innodb_lock_waits;
查看被阻塞的事务

两阶段锁协议

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

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

锁分类

不同锁之间的兼容性:

image.png

行级锁

共享锁(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 锁》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于mysql的知识点!

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表