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