项目中并发修改可能存在的问题
2023-04-18 15:18:19 时间
最近做的一个功能和同事做的工作存在交集,他做的主要是写一张表的增、删、改、查的功能,自己主要负责的是
数据同步功能,从以前的旧系统同步数据到新系统中。自己在写代码的时候发现同事写的代码中有这么一段代码,功能
很简单就是根据ID去查询数据,然后在代码中对该条数据中的某个字段进行加一。自己看到这段代码,立马想到这种写
代码的方式可能存在问题,比如在并发请求的时候,这种方式是会存在问题的,下面来复现一下这个问题。
写一个简单的测试demo,使用controller,service,dao经典的三层方式。
创建一张简单的数据表,把需要更新的字段user_times的值设置为0。为了看得更加清楚,查询的时候多添加了一个查询时间,如下图所示
下面的配置简单来说就是在0.5s内启动100个线程来访问后台的接口,并执行3次访问。按照每次加一在计算,user_times的数量应该是300。
测试结果一为63.
将user_times置为0之后,在测试两次结果为:
三次实际测试的结果和预期的结果都不一致,说明这段代码是存在问题的。
问题已经暴露出来,那如何解决这个问题呢?
提供两个解决方法,方法一直接在该方法上加锁,如下图
在次测试,结果为300符合预期。
方法二,将user_times自增加一的操作放在数据库中去执行,改动如下,service方法修改为如下方法,
数据库操作的方法修改为下面的方法,
在次清空数据进行测试,结果为300,符合预期。
有兴趣的小伙伴可以自己去写一个简单的测试demo试一试,这样能够更加直观地看到问题。或者是有其他解决办法的朋友,
欢迎留言讨论。
相关文章
- Jease 2.6发布 Java开源内容框架
- JVM调优总结:反思
- JVM调优总结:调优方法
- JVM调优总结:新一代的垃圾回收算法
- JVM调优总结:典型配置举例
- JVM调优总结:分代垃圾回收详述
- JVM调优总结:垃圾回收面临的问题
- JVM调优总结:基本垃圾回收算法
- JVM调优总结:一些概念
- 用Java GUI编写的画板程序
- Java的动态绑定机制
- jOOQ 2.0.2发布 Java的ORM框架
- Java中带复选框的树的实现和应用
- Java网络编程菜鸟进阶:TCP和套接字入门
- 甲骨文与谷歌专利权之争定于今年三月开审
- Java调用C/C++编写的第三方dll动态链接库
- 集成开发环境 NetBeans IDE 7.1正式版发布
- kangle 2.7.5紧急发布 防hash碰撞攻击
- 东方通技术引领模式为国产软件“争权”
- UML中关联,组合与聚合等关系的辨析