MySQL史上最全锁分类-持续更新中

发布时间:2024年01月18日

MySQL锁分类

1、锁分类概述总结

image-20231228100224125

2、全局锁

全局锁针对整个数据库的锁,求中包括读锁和写锁

读锁(共享锁): 他阻止其他用户更新数据,但他允许他们读取数据,这在需要一段时间内保持数据一致性很重要
**写锁(排它锁):**他会阻止其他用户读取和更新数据,这在你需要修改一些大量数据,并且不希望其他用户在这堵段时间内干扰有很大作用。

注意:全局锁得开销非常大,因为他会阻止其他所有的数据修改操作,并且在高并发情况可能导致大量的的线程等待锁定,因为应避免在生产环境中使用全局锁,或者尽量减少使用全局锁持有时间,只有在INNODB引擎中使用

在数据库中开启(读写)锁

FLUSH  TABLES WITH READ LOCK
FLUSH  TABLES WITH WRITE LOCK

释放锁

UNLOCK TABLES

3、表级锁

表级锁是mysql中最基本的锁策略,特点是开销小,加锁快,不会出现死锁,锁力度大,发生锁冲突的概率最高,并发度最低

表锁得两种模式:

表共享锁(表读锁):允许一个事务锁定的表进行读取操作,不允许其他事物对其进行写操作,但是可以进行读操作,读锁之间是不会相互阻塞
表独占锁(表写锁):允许一个事务锁定的表进行读取和写入(更新)操作,但对其他任何事务都不能对该表进行任何操作,必须等待表写锁结束,写锁会阻塞其他所有锁,包括读锁和写锁。

在MySQL中对于MyISAM引擎表,读操作会自动加上读锁,对与写操作,会自动加上写锁
在InnoDB引擎汇总在必要情况下会使用表锁,

表锁使用场景
image-20231228163651334

哪些命令会发生表级锁
image-20240116105739626

表锁使用案例

-- 员工表开启表锁
LOCK TABLES tb_employee READ
-- 查看表锁使用情况
SHOW OPEN TABLES WHREE IN_USE>0
-- 更新表是不能进行更新的
UPDATE tb_employee SET NAME="张三" WHERE id=1
-- 释放所有表锁
UNLOCK TABLES 

表锁得风险

image-20240116110340179

4、行锁

image-20240116110914945

注意:行锁只能在事务中使用,

行锁使用场景
image-20240116111109441

哪些场景会导致发生行锁

image-20240116111253897

使用案例

-- 开启事务(行锁只能在事务中使用)
START TRANSACTION
-- 开启一个排它锁
select * from tb_employee where id = 1 for update
-- 开启一个共享锁
-- select * from tb_employee where id = 1 lock in share mode
commit
-- 查看所有锁情况
select * from performance_schema.data_locks


行锁有哪些风险
image-20240116112027798

5、乐观锁悲观锁

乐观锁:

image-20240116134818875

乐观锁使用场景
image-20240116134920517

乐观锁得缺点

image-20240116170049082

6、悲观锁

image-20240116170214911

悲观锁得缺点
image-20240116170652864

7、意向锁共享锁和意向排它锁

image-20240116170925761

image-20240116171227427

8、临键 锁

image-20240118143213543

9、间隙锁

image-20240118143510768

间隙锁得优缺点
image-20240118144011010

文章来源:https://blog.csdn.net/CharlesYooSky/article/details/135674233
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。