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

适合悲观锁的使用场景:

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

如何使用悲观锁:

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

1、SELECT...FOR UPDATE;

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

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

bash 复制代码
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的编辑操作才能有效果。

bash 复制代码
START TRANSACTION;

SELECT * FROM students WHERE id=1 LOCK IN SHARE MODE;

UPDATE students set name='小明' where id=1;

COMMIT;

注意事项:

悲观锁的缺点:

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

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

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

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

相关推荐
霸道流氓气质41 分钟前
SpringBoot中基于 AES-GCM + KMS 密钥管理的数据加解密 Starter 实践
java·数据库·spring boot
三言老师1 小时前
CentOS7.9:Redis服务器部署结构化实战教程
linux·运维·服务器·数据库
番茄炒鸡蛋加糖1 小时前
MySQL 实战调优& 分表基础
数据库·mysql
万亿少女的梦1682 小时前
基于Spring Boot的游戏交易管理系统设计与实现
java·spring boot·mysql·系统设计·交易管理
Database_Cool_2 小时前
云数据库如何保证高可用、故障了怎么办:阿里云 RDS MySQL 高可用架构详解
数据库·mysql·阿里云
中微极客2 小时前
Veo视频生成与Gemini Agent平台集成实践
数据库·人工智能·oracle·音视频
Mem0rin2 小时前
[MySQL] 聚合函数、分组查询、连接查询
android·mysql
Database_Cool_2 小时前
AI 应用的上下文、记忆、向量数据用什么数据库存——阿里云 Tair 选型指南
数据库·人工智能·阿里云
一棵星3 小时前
内网 MySQL 表结构一键导出 Word 文档:直连 + Agent 双模式实战
数据库·mysql·word
向日的葵0063 小时前
Redis会话机制vsJWT机制深度解析
数据库·redis·python·缓存·系统架构·jwt