MySQL乐观锁经常在大厂被问到,比如:MySQL乐观锁是什么?实现原理?…等,下面我就来详解MySQL乐观锁@mikechen
MySQL乐观锁
MySQL乐观锁,顾名思义就是很“乐观”,也就在更新数据时不加锁,而是通过“版本号”、或“时间戳”来检测数据是否被修改。
MySQL乐观锁实现原理
MySQL的乐观锁通过版本号或时间戳机制实现,其核心原理:是在更新数据时检查数据是否被其他事务修改,从而避免并发冲突。
实现步骤,如下:
第一:增加“版本号”。
在数据库表,中添加一个版本号字段,通常命名为 version
。
ALTER TABLE orders ADD COLUMN version INT DEFAULT 1;
这个字段用于记录数据的版本信息,每当数据被更新时,版本号会自动递增。
第二:读取数据。
获取当前数据的版本号,(如:version字段)、或时间戳。
读取数据 SELECT id, stock, version FROM product WHERE id = 1;
第三:提交更新。
更新数据时,校验版本号,是否与读取时一致。
UPDATE table SET column1 = new_value, version = version + 1 WHERE id = target_id AND version = old_version;
比如,通过版本号的方式,更新库存:
更新时校验版本号 UPDATE product SET stock = stock - 1, version = version + 1 WHERE id = 1 AND version = 1; -- 假设当前version=1
在更新数据时,检查 version
字段的值是否与预期一致,如果一致则更新数据并递增 version
值,否则更新失败。
比如:成功(affected rows > 0
),更新成功,业务继续执行。
失败(affected rows = 0
),说明数据已被其他事务修改,需要重新读取数据并重试。
在读多写少的场景下,乐观锁不会像悲观锁那样在读操作时加锁,从而减少了锁的开销,这是MySQL乐观锁最大的优点。
适用于数据冲突较少的场景,避免锁带来的性能损耗。
但是,在大部分金融交易,要求数据强一致性的场景,则需要悲观锁。