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

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.lryc.cn/news/525420.html

相关文章:

  • 某大厂一面:HashMap 的put方法具体做了哪些操作
  • WPF基础 | 深入 WPF 事件机制:路由事件与自定义事件处理
  • 精选100+套HTML可视化大屏模板源码素材
  • 如何使用Python爬虫按关键字搜索AliExpress商品:代码示例与实践指南
  • No.36 学习 | Python 函数:从基础到实战
  • Unity常用特性(Attribute)用法
  • VUE对接deepseekAPI调用
  • 【Postman 接口测试】接口测试基础知识
  • 谷粒商城——商品服务-三级分类
  • 视觉语言模型 (VLMs):跨模态智能的探索
  • HarmonyOS NEXT:华为分享-碰一碰开发分享
  • 宝塔Linux+docker部署nginx出现403 Forbidden
  • 软件测试丨Redis 的数据同步策略以及数据一致性保证
  • C语言-运算符
  • 困境如雾路难寻,心若清明步自轻---2024年创作回顾
  • 表格标签基本使用
  • 【学术会议论文投稿】深度解码:机器学习与深度学习的界限与交融
  • 使用printmap()函数来打印地图
  • MyBatis Plus 的 InnerInterceptor:更轻量级的 SQL 拦截器
  • Java复习第四天
  • docker 安装 mysql 详解
  • 本地Ubuntu轻松部署高效性能监控平台SigNoz与远程使用教程
  • 防火墙的会话并发数、端口数量及其关系‌
  • 随机变量的变量替换——归一化流和直方图规定化的数学基础
  • Java春招面试指南前言
  • 【技术洞察】2024科技绘卷:浪潮、突破、未来
  • 为AI聊天工具添加一个知识系统 之54 为事务处理 设计 基于DDD的一个 AI操作系统 来处理维度
  • 【数据结构】二分查找
  • 读书笔记《网络是怎样连接的》
  • Java 设计模式一