MySQL悲观锁和乐观锁

MySQL悲观锁和乐观锁

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

悲观锁(Pessimistic Locking)

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

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

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

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

案例演示

悲观锁案例

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

sql 复制代码
-- 创建表
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);

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

sql 复制代码
-- 开启事务
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表,其中包含产品信息和版本号。

sql 复制代码
-- 创建表
CREATE TABLE products (
    id INT PRIMARY KEY,
    product_name VARCHAR(100),
    version INT DEFAULT 1
);

-- 插入测试数据
INSERT INTO products (id, product_name) VALUES (1, 'Smartphone');

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

sql 复制代码
-- 读取产品信息和版本号
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课程视频:

html 复制代码
<!-- 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
相关推荐
2501_941805934 小时前
在大阪智能零售场景中构建支付实时处理与高并发顾客行为分析平台的工程设计实践经验分享
数据库
李慕婉学姐5 小时前
【开题答辩过程】以《基于JAVA的校园即时配送系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·开发语言·数据库
珠海西格电力5 小时前
零碳园区有哪些政策支持?
大数据·数据库·人工智能·物联网·能源
哈里谢顿5 小时前
记录一次sql优化记录
mysql
数据大魔方5 小时前
【期货量化实战】日内动量策略:顺势而为的短线交易法(Python源码)
开发语言·数据库·python·mysql·算法·github·程序员创富
Chasing Aurora6 小时前
数据库连接+查询优化
数据库·sql·mysql·prompt·约束
倔强的石头_6 小时前
【金仓数据库】ksql 指南(六)—— 创建与管理用户和权限(KingbaseES 安全控制核心)
数据库
小熊officer7 小时前
Python字符串
开发语言·数据库·python
渐暖°7 小时前
JDBC直连ORACLE进行查询
数据库·oracle
萧曵 丶7 小时前
Next-Key Lock、记录锁、间隙锁浅谈
数据库·sql·mysql·mvcc·可重复读·幻读