悲观锁和乐观锁详解mysql

2023年 8月 9日 20.3k 0

在 MySQL 中,有两种常见的并发控制技术:悲观锁和乐观锁。这两种技术的目的都是为了控制并发,避免数据冲突。下文将详细介绍悲观锁和乐观锁的原理和具体应用。

悲观锁

悲观锁和乐观锁详解mysql

悲观锁是一种比较悲观的锁策略,它认为在整个事务期间,数据很可能被其他事务修改,因此默认情况下会对数据加锁,等待其他事务完成之后再释放锁。

BEGIN;
SELECT * FROM my_table WHERE id = 1 FOR UPDATE;
-- do some operations
COMMIT;

在上述代码中,我们使用了 SELECT ... FOR UPDATE 语句来对 my_table 表中 ID 为 1 的记录加排他锁,这意味着其他事务无法对该记录进行更新或删除,直到当前事务结束并释放锁。

使用悲观锁的优点是可以保证数据的一致性,缺点则是会导致资源占用过多,降低并发性。

乐观锁

相比之下,乐观锁则是更为乐观的一种锁策略,它认为整个事务期间,数据很可能没有被其他事务修改,因此不锁数据,而是在执行更新操作时检测数据版本是否发生变化,如果发生了变化,就认为当前事务的操作失败了,需要回滚。

BEGIN;
SELECT * FROM my_table WHERE id = 1;
-- do some operations
UPDATE my_table SET ... WHERE id = 1 AND version = :current_version;
COMMIT;

在上述代码中,我们使用了一个 version 字段来记录数据的版本号,每次更新时都需要将当前版本号传递给数据库服务器,如果数据库中记录的版本号和传递的版本号不一致,则说明数据已经被其他事务修改,当前事务需要回滚。

使用乐观锁的优点是不会阻塞其他事务的访问,提高了并发性,缺点则是可能会导致数据不一致。

总结

在实际应用中,我们可以根据具体的业务场景来选择适合的锁策略。如果需要保证数据的一致性,或者数据的修改频率较高,可以选择悲观锁,否则可以使用乐观锁提高并发性。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论