java 线程安全问题
String hql = "from ReviewStepInfo where pjtfsn=? and code=?";
ReviewStepInfo saveObject = (ReviewStepInfo) reviewStepInfoDAO
.findUnique(hql, pjtfsn, "XXPS");
if (saveObject == null) {
saveObject = new ReviewStepInfo();
saveObject.setId(StringUtils.uuid());
saveObject.setPjtfsn(pjtfsn);
saveObject.setStatus(0);
saveObject.setCode("XXPS");
saveObject.setCreateTime(new Date());
saveObject.setNotConsistentCount(list.size());
saveObject.setReivewCount(0);
reviewStepInfoDAO.saveOrUpdate(saveObject);
}
根据表的两个字段 判断数据库是否有这条数据,如果没有就创建,但是,不知道什么原因 在数据库出现三条一致的数据。 每隔三秒由ajax发出请求执行这个方法。
我猜想的原因是由于浏览器的原因 ajax阻塞了?同时发出三条请求让后台处理才导致的?遇到这种情况只能加锁吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
加锁比较简单,但是性能不高。
建议使用数据库的事务,隔离读操作。
如果你不想出现重复数据应该将表加上unique constraint限制,这样重复插入会抛出unique constraint exception.
不需要在java线程中加锁,应该对数据库进行加锁,这个依赖数据库的实现,你只需设置事务的隔离级别就可以。不知道你代码中上下文有无设置事务,如果没有,请一定设置,即使是全读的操作也应该要处于事务中。
如果你使用spring-tx管理事务,也可以使用注解
@Transactional(isolation=Isolation.SERIALIZABLE)
加在方法上。客户端为何发送3个相同请求,这也是需要解决,但服务端应该保证即使客户端发疯,也要良好运作。