这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战
⭐8月更文挑战第5天⭐,进行MybatisPlus的学习,欢迎小伙伴们一起学习😁
Code皮皮虾 一个沙雕而又有趣的憨憨少年,和大多数小伙伴们一样喜欢听歌、游戏,当然除此之外还有写作的兴趣,emm…,日子还很长,让我们一起加油努力叭🌈
欢迎各位小伙伴们关注我的公众号:JavaCodes,名称虽带Java但涉及范围可不止Java领域噢😁,期待您的关注❤
前序
1、乐观锁概述
**乐观锁( Optimistic Locking )** 相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。而乐观锁机制在一定程度上解决了这个问题。乐观锁,大多是基于数据版本( **Version** )记录机制实现。何谓数据版本?即为数据增加一个**版本标识**,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version” 字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,**将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号等于数据库表当前版本号,则予以更新,否则认为是过期数据。**
2、主要适用场景
意图:
当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁实现方式:
- 取出记录时,获取当前version
- 更新时,带上这个version
- 执行更新时, set version = newVersion where version = oldVersion
- 如果version不对,就更新失败
1 | sql复制代码–A线程 |
3、配置乐观锁
数据库新增字段==version==
==Java实体类增加对应version字段==
@Version说明:
- 支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
- 整数类型下
newVersion = oldVersion + 1
newVersion
会回写到entity
中- 仅支持
updateById(id)
与update(entity, wrapper)
方法 - 在
update(entity, wrapper)
方法下,wrapper
不能复用!!!
==建立配置类,配置乐观锁插件==
1 | sql复制代码@Configuration |
4、测试乐观锁
正常来说最后的结果会是测试一,但结果是测试二,因为乐观锁机制,线程1和线程2最开始获取到的version值都为1,但是线程2更新完毕后version自增成为2,此时线程1来更新version不是预期值1,所以更新失败!!!
最后
我是 Code皮皮虾,一个热爱分享知识的 皮皮虾爱好者,未来的日子里会不断更新出对大家有益的博文,期待大家的关注!!!
创作不易,如果这篇博文对各位有帮助,希望各位小伙伴可以==一键三连哦!==,感谢支持,我们下次再见~
本文转载自: 掘金