阿里面试:MySQL乐观锁是什么?底层实现原理?

阿里面试:MySQL乐观锁是什么?底层实现原理?-mikechen

MySQL乐观锁经常在大厂被问到,比如:MySQL乐观锁是什么?实现原理?…等,下面我就来详解MySQL乐观锁@mikechen

MySQL乐观锁

MySQL乐观锁,顾名思义就是很“乐观”,也就在更新数据时不加锁,而是通过“版本号”、或“时间戳”来检测数据是否被修改。

阿里面试:MySQL乐观锁是什么?底层实现原理?-mikechen

 

MySQL乐观锁实现原理

MySQL的乐观锁通过版本号或时间戳机制实现,其核心原理:是在更新数据时检查数据是否被其他事务修改,从而避免并发冲突。

阿里面试:MySQL乐观锁是什么?底层实现原理?-mikechen

实现步骤,如下:

第一:增加“版本号”。

在数据库表,中添加一个版本号字段,通常命名为 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 值,否则更新失败。

阿里面试:MySQL乐观锁是什么?底层实现原理?-mikechen

比如:成功(affected rows > 0),更新成功,业务继续执行。

失败(affected rows = 0),说明数据已被其他事务修改,需要重新读取数据并重试。

在读多写少的场景下,乐观锁不会像悲观锁那样在读操作时加锁,从而减少了锁的开销,这是MySQL乐观锁最大的优点。

适用于数据冲突较少的场景,避免锁带来的性能损耗。

但是,在大部分金融交易,要求数据强一致性的场景,则需要悲观锁。

评论交流
    说说你的看法