mysql的乐观锁与悲观锁
1.悲观锁
含义:假设会发生冲突,因此在操作数据之前对数据加锁,确保其他事务无法访问该数据。
应用场景:适用于并发冲突多,写多读少的场景,通过加锁的方式确保数据的安全性。
实现方式:使用行锁或表锁,例如使用 select ... for update 或 select ... lock in share mode 语句来加锁。
数据库实现悲观锁的代码示例:
-- 读取数据并加锁
SELECT id, name FROM users WHERE id = 1 FOR UPDATE;-- 执行更新操作
UPDATE users SET name = 'new_name' WHERE id = 1;
2.乐观锁
含义:假设不会发生冲突,因此在操作数据时不加锁,而是在更新数据时进行校验。如果发现数据被其事务修改,则会拒绝当前事务的修改,需重新尝试。
应用场景:适用于并发冲突少,读多写少的场景,不用加锁而是通过比较字段版本号或时间戳是否发生改变的方式确保数据的安全性。
实现方式:通常通过版本号或时间戳来实现,每次更新时检查版本号或时间戳是否一致。
数据库实现乐观锁的代码示例:
-- 假设有一张用户表users,包含id、name和version字段-- 读取数据
SELECT id,name,version FROM users WHERE id = 1;-- 更新数据时检查版本号
UPDATE users SET name = "new_name",version = version + 1
WHERE id = 1 AND version = current_version;