当前位置: 首页 > article >正文

12、MySQL锁相关知识

目录

1、全局锁和表锁使用场景

2、行锁的意义

3、为什么说间隙锁解决了快照的幻读?

4、RR隔离级别产生幻读的场景

5、详解元数据锁(MDL)作用以及如何减少元数据锁

6、出现死锁场景

7、查看MySQL锁情况

8、自增锁


1、全局锁和表锁使用场景

全局锁

  • 备份数据库:当需要对整个数据库进行一致性备份时,使用全局锁可以确保在备份过程中数据库的数据状态不会发生变化,从而保证备份数据的完整性和一致性。例如,在使用 mysqldump 工具备份数据库时,可以通过添加 --single-transaction 参数来实现一致性备份,但对于一些不支持事务的存储引擎(如 MyISAM),或者需要确保绝对一致性的场景,就可能需要使用全局锁来保证在备份期间没有其他事务对数据进行修改。

  • 进行数据库级别的操作:如执行数据库的升级、数据迁移等操作时,为了避免在操作过程中有其他事务干扰,可能需要使用全局锁来锁定整个数据库,确保操作的稳定性和正确性。比如要对数据库的存储引擎进行升级,或者将数据库从一个服务器迁移到另一个服务器时,使用全局锁可以防止在操作过程中数据被修改,保证数据的一致性和完整性。

表锁

  • 并发写入较少的场景:对于一些并发写入操作较少的表,使用表锁可以简单有效地控制对表的访问。例如,一些配置表、字典表等,这些表的数据相对稳定,很少有并发的写入操作,使用表锁可以在需要更新数据时,确保在更新过程中没有其他事务对该表进行写入操作,避免数据冲突。

  • 数据一致性要求较高的特定操作:当需要对表中的数据进行一些复杂的批量操作,并且要求操作过程中数据的一致性非常高时,表锁可以发挥作用。比如,在进行数据的批量删除、批量更新等操作时,使用表锁可以防止在操作过程中有其他事务对表中的数据进行修改,从而保证操作结果的准确性和一致性。

  • 与其他不支持行级锁的存储引擎配合:如果使用的是不支持行级锁的存储引擎(如 MyISAM),那么在需要控制并发访问时,就只能使用表锁。例如,在一些传统的日志记录系统中,可能会使用 MyISAM 存储引擎来存储日志数据,由于其不支持行级锁,在对日志表进行写入操作时,就需要使用表锁来保证数据的完整性和一致性。

  • 跨事务的表级操作:当多个事务需要对同一个表进行一系列相互关联的操作,且这些操作需要保证原子性和一致性时,表锁可以用来协调这些事务的执行。例如,在一个电商系统中,可能有多个事务需要对订单表进行插入、更新和删除操作,为了确保这些操作在整个业务逻辑中是一致的,不会出现数据不一致的情况,可以使用表锁来保证在这些操作执行期间,其他事务不会对订单表进行干扰。

全局锁和表锁在数据库管理和开发中都有各自重要的使用场景,需要根据具体的业务需求、数据访问模式和数据库的特点来合理选择和使用,以确保数据库的性能和数据的一致性。

全局锁命令

FLUSH TABLES WITH READ LOCK;
解锁
UNLOCK TABLES;

表锁命令

表读所
lock tables t14 read;
解锁执行
UNLOCK TABLES;
​
表写锁(发起线程可读写,其他线程不能写)
lock tables t14  write;
解锁执行
UNLOCK TABLES;

2、行锁的意义

MySQL5.5之前是myisam,5.6之后默认innodb存储引擎,innodb存储引擎最重要的是行锁和事务。

行锁模式:

共享锁:如果一个事务获取共享锁,其他事务还可以读取数据,但是不能修改。

排他锁:如果一个事务获取排他锁,其他事务读写都会被阻塞。

默认select不会加锁,需要手动添加

共享锁
begin
select * from t1 where a = 1 lock in share mode;
​
排他锁
select * from t1 where a = 1 for update;
​
commit

提高并发性能

  • 在高并发环境下,如果多个事务只是对表中的不同行进行操作,使用行锁可以让这些事务同时执行,而不会像表锁那样,一个事务操作表时会阻塞其他事务对整个表的访问。例如,在一个电商订单系统中,多个用户同时下单购买不同的商品,每个订单对应订单表中的不同行,使用行锁可以让这些下单操作并发执行,大大提高了系统的并发处理能力,减少了事务之间的等待时间,提升了系统的整体性能和响应速度。

保证数据一致性

  • 行锁可以确保在同一时间内,只有一个事务能够对某一行数据进行修改,从而避免了数据冲突和数据不一致的问题。比如在银行转账业务中,涉及到转出账户和转入账户余额的修改,这两个操作可能在不


http://www.kler.cn/a/518594.html

相关文章:

  • 数据结构——二叉树——堆(1)
  • Vue入门(Vue基本语法、axios、组件、事件分发)
  • ### 2.5.3 二叉树的基本操作
  • 【Ubuntu】安装SSH启用远程连接
  • C++内存分布与进程地址空间
  • Flink读写Kafka(Table API)
  • 分布式系统架构怎么搭建?
  • Flutter_学习记录_导航和其他
  • 小程序电商运营内容真实性增强策略及开源链动2+1模式AI智能名片S2B2C商城系统源码的应用探索
  • Linux之NetLink学习笔记
  • docker Ubuntu实战
  • 计算机图形学:实验四 带纹理的OBJ文件读取和显示
  • vue3自定义表格生成动态列
  • linux系统中的 scp的使用方法
  • 【面试题】 Java 三年工作经验(2025)
  • 2025美赛数学建模C题 奥运奖牌模型保姆级教程讲解|模型讲解
  • 为AI聊天工具添加一个知识系统 之68 详细设计 之9 三种中台和时间度量 之1
  • SpringBoot打包为JAR包或WAR 包,这两种打包方式在运行时端口将如何采用?又有什么不同?这篇文章将给你解惑
  • ESP8266 NodeMCU与WS2812灯带:实现多种花样变换
  • 家政预约小程序09服务管理
  • 使用Redis缓解数据库压力+三种常见问题
  • 【C++图论 最短路】2642. 设计可以求最短路径的图类|1810
  • 蓝桥杯3519 填充 | 分类讨论
  • 大型齿轮箱健康监测与智能维护系列套件:测试台+故障诊断算法工具箱+齿轮箱智能维护系统平台+案例分析
  • 数字MIC PDM接口
  • 【探索前端技术之 React Three.js—— 简单的人脸动捕与 3D 模型表情同步应用】