MySQL悲观锁和乐观锁

ops/2024/12/29 2:11:07/

MySQL悲观锁乐观锁

数据库中,锁是用来管理并发控制的一种机制,确保数据的一致性和完整性。MySQL中的悲观锁乐观锁是两种不同的并发控制策略,它们在处理并发事务时采用不同的方法。

悲观锁(Pessimistic Locking)

悲观锁假设会发生冲突,因此它会在事务开始时锁定数据,阻止其他事务修改这些数据,直到当前事务完成。

  • 适用场景:适用于写操作多的场景,因为写操作之间是互斥的。
  • 实现方式:通常通过SELECT ... FOR UPDATE语句实现。
乐观锁(Optimistic Locking)

乐观锁假设冲突发生的概率较小,因此它不会在事务开始时锁定数据。相反,它会在数据提交时检查在事务执行期间数据是否被其他事务修改过。

  • 适用场景:适用于读操作多的场景,因为读操作之间不是互斥的。
  • 实现方式:通常通过版本号(version)或时间戳(timestamp)实现。

案例演示

悲观锁案例

假设我们有一个orders表,其中包含订单数据,我们希望在更新订单状态时使用悲观锁

-- 创建表
CREATE TABLE orders (id INT PRIMARY KEY,product_name VARCHAR(100),order_status VARCHAR(10),order_amount INT
);-- 插入测试数据
INSERT INTO orders (id, product_name, order_status, order_amount) VALUES (1, 'Laptop', 'PENDING', 1000);

使用悲观锁更新订单状态:

-- 开启事务
START TRANSACTION;-- 锁定特定行并更新
SELECT * FROM orders WHERE id = 1 FOR UPDATE;-- 更新订单状态
UPDATE orders SET order_status = 'SHIPPED' WHERE id = 1;-- 提交事务
COMMIT;

在这个案例中,SELECT ... FOR UPDATE语句锁定了id = 1的行,直到事务提交,其他事务都不能修改这行数据。

乐观锁案例

假设我们有一个products表,其中包含产品信息和版本号。

-- 创建表
CREATE TABLE products (id INT PRIMARY KEY,product_name VARCHAR(100),version INT DEFAULT 1
);-- 插入测试数据
INSERT INTO products (id, product_name) VALUES (1, 'Smartphone');

使用乐观锁更新产品名称:

-- 读取产品信息和版本号
SELECT id, product_name, version FROM products WHERE id = 1;-- 假设读取到的版本号是1,现在更新产品名称和版本号
UPDATE products SET product_name = 'Updated Smartphone', version = version + 1 WHERE id = 1 AND version = 1;-- 如果没有行被更新,说明在读取和更新之间有其他事务更新了数据

在这个案例中,我们通过版本号来实现乐观锁。当我们尝试更新产品名称时,我们会检查版本号是否与我们读取时的版本号相同。如果不同,说明在读取和更新之间有其他事务更新了数据,我们可以决定重试或者放弃更新。

总结

悲观锁乐观锁是处理并发事务的两种策略。悲观锁适用于写操作多的场景,通过锁定数据来保证事务的一致性。乐观锁适用于读操作多的场景,通过版本控制来减少锁的开销,提高系统的并发性能。在实际应用中,选择哪种锁策略取决于具体的业务场景和性能要求。

附springboot,springcloudalibaba课程视频:

<!-- springboot,springboot整合redis,整合rocketmq视频: -->
https://www.bilibili.com/video/BV1nkmRYSErk/?vd_source=14d27ec13a4737c281b7c79463687112<!-- springcloudalibaba,openfeign,nacos,gateway,sso视频:-->
https://www.bilibili.com/video/BV1cFDEYWEkY/?vd_source=14d27ec13a4737c281b7c79463687112<!-- vue+springboot前后端分离视频:-->
https://www.bilibili.com/video/BV1JLSEYJETc/?vd_source=14d27ec13a4737c281b7c79463687112<!-- shiro视频:-->
https://www.bilibili.com/video/BV1YVUmYJEPi/?vd_source=14d27ec13a4737c281b7c79463687112

http://www.ppmy.cn/ops/139593.html

相关文章

【代码管理之道】Git 分支管理与远程仓库操作详解

引言 在前两篇文章中&#xff0c;我们详细介绍了 Git 的基本概念、安装配置、初始化仓库、添加和提交文件、查看状态、查看提交历史和撤销操作。本文将继续深入探讨 Git 的分支管理和远程仓库操作&#xff0c;帮助读者更好地理解和使用 Git 的高级功能。通过这些高级功能&…

Spring Boot漫画之家:漫画资源的智能分类与标签

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&a…

el-select 修改样式

这样漂亮的页面&#xff0c;搭配的却是一个白色风格的下拉框 &#xff0c;这也过于刺眼。。。 调整后样式为&#xff1a; 灯红酒绿总有人看着眼杂&#xff0c;但将风格统一终究是上上选择。下面来处理这个问题。 分为两部分。 第一部分&#xff1a;是修改触发框的样式 第二部…

在超表面中琼斯矩阵的使用

琼斯矩阵&#xff08;Jones Matrix&#xff09; 是一种线性代数方法&#xff0c;用于描述光的偏振状态和偏振变化&#xff0c;是偏振光学中重要的数学工具。它在 超表面理论设计 中广泛应用&#xff0c;尤其是在设计和调控光与物质相互作用时&#xff0c;例如偏振控制、相位调制…

ENDC下UE无法注册5G的问题

这是一个ENDC场景&#xff0c;UE无法注册5G网络&#xff0c;也就是UE无法添加NR cell的问题。现在就是UE注册LTE后&#xff0c;网络侧没有配置NR 测量相关的object及event&#xff0c;后面也没有什么盲添加NR cell的过程。 如上图&#xff0c;UE注册LTE后就在LTE做一些业务。之…

贪心算法part01

文章参考来源代码随想录 贪心算法&#xff1a;局部最优到全局最优 455.分发饼干 这里的局部最优就是大饼干喂给胃口大的&#xff0c;充分利用饼干尺寸喂饱一个&#xff0c;全局最优就是喂饱尽可能多的小孩 可以尝试使用贪心策略&#xff0c;先将饼干数组和小孩数组排序 然…

Spring Boot+Netty

因工作中需要给第三方屏幕厂家下发广告&#xff0c;音频&#xff0c;图片等内容&#xff0c;对方提供TCP接口于是我使用Netty长链接进行数据传输 1.添加依赖 <!-- netty依赖--><dependency><groupId>io.netty</groupId><artifactId>netty-all&…

EasyAnimateV5 视频生成大模型原理详解与模型使用

在数字内容创作中&#xff0c;视频扮演的角色日益重要。然而&#xff0c;创作高质量视频通常耗时且昂贵。EasyAnimate 系列旨在利用人工智能技术简化这一过程。EasyAnimateV5 建立在其前代版本的基础之上&#xff0c;不仅在质量上有所提升&#xff0c;还在多模态数据处理和跨语…