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

mysql 悲观锁和乐观锁(—悲观锁)

适合悲观锁的使用场景:

悲观锁更适合在,写操作较多、并发冲突高、业务需要强一致性等场景下使用悲观锁。

如何使用悲观锁:

悲观锁主要通过以下两个 SQL语句实现:

1、SELECT...FOR UPDATE;

这个语句会在所查询中的数据行上设置排他锁(Exclusive Lock)。在数据被锁定期间,其他事务无法修改这些被选中的行数据,也无法对他们设置新的排它锁和共享锁。

eg: 当sql语句运行至2的时候,事务已被成功开启且对指定行数据加上了排他锁,这时候,在别的进程/窗口中再对id=1的数据进行update修改命令的话,会执行失败,因为数据已经被锁定了。这时候只有当前进程/窗口可以对该数据进行编辑操作,编辑完成后。执行至语句4,提交并关闭了事务后,其他窗口对id=1的update的编辑操作才能有效果。

START TRANSACTION;  // 1、开启事务SELECT * FROM students WHERE id=1 FOR UPDATE;//2、查询指定行数据并加排它锁UPDATE students set name='小明' where id=1; // 3、修改数据COMMIT;    // 4、提交并关闭事务

2、SELECT...LOCK IN SHARE MODE;

这个 语句会在所查询的数据行上设置共享锁(Shared Lock)。在被锁定期间,其他事务可以读取这些行,但不能修改这些行, 也不能在这些数据行上这设置排他锁。

eg: 当sql语句运行至2的时候,事务已被成功开启且对指定行数据加上了共享锁,这时候,在别的进程/窗口中再对id=1的数据进行查询操作是能查询到对应的数据的,但若进行update修改命令的话,则会执行失败,因为数据已经被锁定了。这时候只有当前进程/窗口可以对该数据进行编辑操作,编辑完成后。执行至语句4,提交并关闭了事务后,其他窗口对id=1的update的编辑操作才能有效果。

START TRANSACTION;SELECT * FROM students WHERE id=1 LOCK IN SHARE MODE;UPDATE students set name='小明' where id=1;COMMIT;


注意事项:

悲观锁的缺点:

        1、增加性能开销:对数据的读写进行加锁和解锁操作,会增加系统的开销,特别是高并发的环境下,锁的竞争会严重影响到系统性能。所以悲观锁机制对资源的锁定操作会影响系统性能。

        2、降低并发度:悲观锁在操作数据前会加锁,这导致了同一时间,只有一个事务能操作数据,其他事务只能等待,这严重降低了系统的并发性。

        3、死锁:当遇上多个事务相互等待对方释放锁时,就可能发生死锁。虽然数据库系统通常能够检测并解决死锁,但这回导致食物回滚,增加系统的开销。

        4、锁超时:如果一个食物长时间加锁而不释放,可能导致其他等待锁的事务超时,这不仅导致等待的事务失败,还可能印象到整个系统的稳定性。

http://www.lryc.cn/news/2399418.html

相关文章:

  • Promtail采集服务器本地日志存储到Loki
  • python第31天打卡
  • 4.1 HarmonyOS NEXT原生AI能力集成:盘古大模型端侧部署与多模态交互实战
  • 学习STC51单片机27(芯片为STC89C52RCRC)
  • PAT-甲级JAVA题解(更新中...)
  • Deep Chat:重塑人机对话边界的开源智能对话框架—— 让下一代AI交互无缝融入你的应用
  • DA14531_beacon_大小信标设备开发
  • 【算法训练营Day06】哈希表part2
  • Word双栏英文论文排版攻略
  • 乡村三维建模 | 江苏农田无人机建模案例
  • 2025 5 月 学习笔记
  • SpringBoot(七) --- Redis基础
  • Oracle 故障实例 - 通过备份恢复到某时间点 故障恢复
  • 滑动智能降级:Glide优化加载性能的黑科技
  • 【前端并发请求控制:必要性与实现策略】
  • LeetCode 139. 单词拆分(Word Break) - 动态规划深度解析
  • @Prometheus动态配置管理-ConsulConfd
  • CentOS7 + JDK8 虚拟机安装与 Hadoop + Spark 集群搭建实践
  • 从OSI到TCP/IP:网络协议的演变与作用
  • Stream流性能分析及优雅使用
  • iOS 电子书听书功能的实现
  • 【和春笋一起学C++】(十七)C++函数新特性——内联函数和引用变量
  • GitHub 趋势日报 (2025年06月02日)
  • 卫星的“太空陀螺”:反作用轮如何精准控制姿态?
  • proteus新建工程
  • 缓存击穿 缓存穿透 缓存雪崩
  • RTC实时时钟DS1338Z-33/PT7C433833WEX国产替代FRTC1338S
  • Redis命令使用
  • 【免费数据】1980-2022年中国2384个站点的水质数据
  • Java基础 Day28 完结篇