Mysql锁家族
2023-01-13 09:53:31 0 举报
AI智能生成
Mysql中锁的分类
作者其他创作
大纲/内容
对数据的操作类型划分<br>
共享锁(读锁)
读锁:也称为共享锁、英文用S表示。针对同一份数据,多个事务的读操作可以同时进行而不会互相影响,相互不阻塞的。
<span style="color: rgb(16, 18, 20); font-family: "PingFang SC", "Segoe UI", Arial, "Microsoft YaHei", 微软雅黑, 宋体, "Malgun Gothic", sans-serif; font-size: 14px; white-space: pre-wrap; caret-color: rgb(251, 74, 62);">在采用加锁方式解决</span><span style="font-family: "PingFang SC", "Segoe UI", Arial, "Microsoft YaHei", 微软雅黑, 宋体, "Malgun Gothic", sans-serif; font-size: 14px; white-space: pre-wrap; caret-color: rgb(251, 74, 62);"><font color="#e57373">脏读、不可重复读、幻读</font></span><span style="color: rgb(16, 18, 20); font-family: "PingFang SC", "Segoe UI", Arial, "Microsoft YaHei", 微软雅黑, 宋体, "Malgun Gothic", sans-serif; font-size: 14px; white-space: pre-wrap; caret-color: rgb(251, 74, 62);">这些问题时,读取一条记录时需要获取该记录的S锁,其实是不严谨的,有时候需要在读取记录时就获取记录的X锁,来禁止别的事务读写该记录,</span><br>
查询时获取读锁的两种方式
SELECT ... LOCK IN SHARE MODE<br>
SELECT ... FOR SHARE<br>
MySQL8.0新特性
在SELECT ... FOR UPDATE 后可以添加关键字,<br>用于控制没有获取到锁时的行为
NOWAIT<br>
立即报错返回
SKIP LOCKED
立即返回,只是返回的结果中不包含被锁定的行
排他锁(写锁)<br>
写锁:也称为排他锁、英文用x表示。当前写操作没有完成前,它会阻断其他写锁和读锁。这样就能确保在给定的时间里,只有一个事务能执行写入,并防止其他用户读取正在写入的同一资源。
修改时获取写锁的方式
UPDATE ... FOR UPDATE
S锁和X锁兼容性
写操作
DELETE
对一条记录做DELETE操作的过程其实是先在B+树中定位到这条记录的位置,然后获取这条记录的X锁,再进行delete mark操作。<br>我们也可以把这个定位待删除记录在B+树中位置的过程看成是一个获取X锁的锁定读。
UPDATE
情况1:未修改该记录的键值,并且被更新的列占用的存储空间在修改前后未发生变化。
情况2:未修改该记录的键值,并且至少有一个被更新的列占用的存储空间在修改前后发生变化。
情况3:修改了该记录的键值<br>
INSERT
一般情况下,新插入一条记录的操作并不加锁,通过一种称之为<font color="#f44336">隐式锁</font>的结构来保护这条新插入的记录在本事务提交前不被别的事务访问。
锁粒度角度划分<br>
表级锁<br>
表级别的S锁、x锁<br>
获取表锁
LOCK TABLES t READ
LOCK TABLES t WRITE
释放锁
UNLOCK TABLES t;<br>
查看表锁情况<br>
SHOW OPEN TABLES;
总结
MyISAM在执行查询语句(SELECT)前,会给涉及的所有表加读锁,在执行增删改操作前,会给涉及的表加写锁。<br>InnoDB存储引擎是不会为这个表添加表级别的读锁或者写锁的。<br>
意向锁<br>
意向共享锁(intention shared lock, IS)
事务有意向对表中的某些行加共享锁(S锁)
意向排他锁(intention exclusive lock, IX)
事务有意向对表中的某些行加排他锁(x锁)
意向锁兼容情况
意向锁之间是互相兼容的,虽然意向锁和自家兄弟互相兼容,但是它会与普通的排他/共享锁互斥。
注意这里的排他/共享锁指的都是表锁,意向锁不会与行级的共享/排他锁互斥。
自增锁 AUTO-INC 锁<br>
元数据锁(MDL)
MDL读锁
MDL写锁
行级锁
记录锁(Record Locks)
S型记录锁
X型记录锁<br>
间隙锁(Gap Locks)<br>
临键锁(next key locks)
记录锁+间隙锁<br>
插入意向锁(insert intention locks)<br>
页级锁<br>
对锁的态度划分<br>
悲观锁(Pessimistic Locking)
乐观锁(Optimistic Locking)
加锁方式划分<br>
隐式锁
显示锁<br>
通过特定的语句进行加锁<br>
添加显示共享锁
SELECT ... FOR SHARE
SELECT ... LOCK IN SHARE MODE<br>
添加显示排他锁
SELECT ... FOR UPDATE
其他
全局锁
死锁<br>
0 条评论
下一页