关注△mikechen△,十余年BAT架构经验倾囊相授!
大家好,我是mikechen。
MySQL乐观锁在工作经常遇到,而且大厂经常考察,比如:MySQL乐观锁的实现与原理等,下面我就来详解MySQL乐观锁@mikechen
最新mikechen原创超30万字《阿里架构师进阶专题合集》和《大厂最全面试题及答案合集》,请关注本公众号【mikechen的架构笔记】,后台回复:合集,即可领取。
MySQL乐观锁
MySQL乐观锁,顾名思义就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,这就是MySQL乐观锁。
MySQL乐观锁的主要作用是解决并发访问数据库时可能出现的数据不一致性问题。
乐观锁的另一个作用:通过不阻塞其他事务的方式来解决锁冲突,从而提高系统的并发性能。
MySQL乐观锁实现原理
在 MySQL中乐观锁主要实现是通过:版本号和时间戳来实现的。
实现原理,大致如下:
在实现乐观锁时,每个数据行都会有一个版本号或时间戳字段;
每次修改数据时都会将版本号或时间戳字段的值加1或更新为当前时间;
在事务提交时,MySQL会比较当前数据行的版本号或时间戳值和事务开始时读取的版本号或时间戳值是否一致;
如果一致则提交成功,否则回滚事务并重新尝试。
以下是一个MySQL乐观锁的使用示例,用户同一时间只能下一个订单,为了避免并发冲突,可以在订单表中添加一个版本号字段version,实现乐观锁。
MySQL乐观锁使用示例,大致如下:
START TRANSACTION;
-- 获取当前订单的版本号
SELECT version FROM order WHERE id = 1;
-- 在版本号基础上加1,更新订单信息
UPDATE order SET version = version + 1 WHERE id = 1 AND version = ?;
-- 如果更新失败,说明有其他事务同时修改了该订单,回滚并重试
IF ROW_COUNT() = 0 THEN
ROLLBACK;
-- 重试代码
ELSE
COMMIT;
END IF;
在上述代码中,主要分为如下步骤:
事务首先查询订单的版本号,然后在更新订单时加上版本号。
如果更新失败,说明有其他事务同时修改了该订单,此时会回滚事务并重试。
如果更新成功,则提交事务。这样就保证了同一时间同一个用户只能下一个订单,并且避免了并发冲突。
MySQL乐观锁,不会对数据加锁,适合并发读取较多的场景,性能高。
但是,当有大量并发写操作时,冲突会较频繁,导致重试操作增加,从而影响性能。
以上
最后送大家一个福利:
送我原创超30万字阿里架构师进阶专题合集。
以及给大家整理最全大厂Java面试题及答案详解,包含:Java、多线程、JVM、Spring、MySQL、Redis、中间件...等必考题答案详解。
需要以上架构专题&面试答案的同学,加我微信即可领取!
添加时备注:资料