人人都是程序员,希望在零碎的阅读时间里,给您一些技术提升。
1 没有锁的风险
开发不设锁,就像没穿裤衩。当海水退去,程序的漏洞就会被一览无遗。现在没出问题,只是因为还有海水为你遮挡了老板们的视线。
听小编给你讲个朋友的故事:一件商品,成本价是80元,售价是100元。老板先是通知小李,说你去把商品价格增加50元。小李正在玩游戏,耽搁了一个小时。正好一个小时后,老板觉得商品价格增加到150元,价格太高,可能会影响销量。又通知小王,你把商品价格降低30元。
此时,小李和小王同时操作商品后台系统。小李操作的时候,系统先取出商品价格100元;小王也在操作,取出的商品价格也是100元。小李将价格加了50元,并将100+50=150元存入了数据库;小王将商品减了30元,并将100-30=70元存入了数据库。是的,如果没有锁,小李的操作就完全被小王的覆盖了。
现在商品价格是70元,比成本价低10元。几分钟后,这个商品很快出售了1千多件商品,老板亏1多万。
2 乐观锁与悲观锁
上面的故事,如果是乐观锁,小王保存价格前,会检查下价格是否被人修改过了。如果被修改过了,则重新取出的被修改后的价格,150元,这样他会将120元存入数据库。如果是悲观锁,小李取出数据后,小王只能等小李操作完之后,才能对价格进行操作,也会保证最终的价格是120元。
接下来小编将介绍如何在mybatis-plus项目中,添加乐观锁。
3 创建项目
先创建一个集成了mybatis-plus的spring boot项目。参考小编的另一篇文章【基于Spring Boot整合mybatis-plus完整详细版经验分享一】。
4 项目配置
在config.MybatisPlusConfig.java文件中,添加乐观锁配置。
配置完成,非常简单,接下来我们做个试验,是否能够确保小李先操作的价格不会被小王后操作而覆盖,对应的版本号是否有自动增加。
5 测试效果
先创建一个商品类,字段为:id、name、price、version;这里请注意,必须给version字段加上@Version的注解。如下图。
编写一个测试函数进行验证。
小李小王取出来的商品价格是100元,版本号是1,小李先操作,把价格改成了150元,同时,version自动加了1。这时小王操作就失败了。然后小王重新取出新的商品,取出的商品价格是150元,版本号是2。小王正常操作,最终的价格是120元,版本是3,避免了风险。
代码复杂,生活简单。抬头看看窗外的天空,不论地面怎么样,天空还是这么的美,就算不出门,也能坐看云起。
6 结束语
人人都是程序员小编,明天分享读写分离和多数据源配置,小编会慢慢带你走入分布式/微服务架构,感谢您的阅读,欢迎关注。
领取专属 10元无门槛券
私享最新 技术干货