首页
学习
活动
专区
圈层
工具
发布

mysql 乐观锁与悲观锁

基础概念

乐观锁(Optimistic Locking): 乐观锁假设数据在大多数情况下不会发生冲突,因此在读取数据时不加锁,只在更新数据时检查数据是否被其他事务修改过。如果数据被修改过,则更新失败,需要重新尝试。

悲观锁(Pessimistic Locking): 悲观锁假设数据在大多数情况下会发生冲突,因此在读取数据时就加锁,防止其他事务修改数据,直到当前事务完成。

优势

乐观锁的优势

  • 并发性高:因为读取数据时不加锁,多个事务可以同时读取同一数据。
  • 适用于读多写少的场景。

悲观锁的优势

  • 数据一致性高:因为读取数据时就加锁,可以有效防止数据被其他事务修改。
  • 适用于写多读少的场景。

类型

乐观锁的类型

  • 版本号控制:在数据表中增加一个版本号字段,每次更新数据时版本号加一,更新时检查版本号是否一致。
  • 时间戳控制:在数据表中增加一个时间戳字段,每次更新数据时更新时间戳,更新时检查时间戳是否一致。

悲观锁的类型

  • 行级锁:锁定具体的数据行,防止其他事务修改。
  • 表级锁:锁定整个数据表,防止其他事务修改。

应用场景

乐观锁的应用场景

  • 读多写少的场景,如大多数互联网应用。
  • 并发性要求高的场景。

悲观锁的应用场景

  • 写多读少的场景,如银行系统、库存管理系统。
  • 数据一致性要求高的场景。

常见问题及解决方法

乐观锁常见问题

  • 更新失败:因为数据在读取后被其他事务修改过。
    • 解决方法:重试机制,当更新失败时,重新读取数据并尝试更新。

悲观锁常见问题

  • 死锁:多个事务互相等待对方释放锁。
    • 解决方法:设置锁的超时时间,或者使用死锁检测机制自动解决死锁。

示例代码

乐观锁示例代码

代码语言:txt
复制
-- 创建表时增加版本号字段
CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(255),
    version INT DEFAULT 0
);

-- 插入数据
INSERT INTO users (id, name) VALUES (1, 'Alice');

-- 更新数据时检查版本号
UPDATE users SET name = 'Bob', version = version + 1 WHERE id = 1 AND version = 0;

悲观锁示例代码

代码语言:txt
复制
-- 使用行级锁
START TRANSACTION;
SELECT * FROM users WHERE id = 1 FOR UPDATE;
UPDATE users SET name = 'Bob' WHERE id = 1;
COMMIT;

参考链接

希望这些信息对你有所帮助!如果有更多问题,欢迎继续提问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的视频

领券