java 线程安全问题
黄舟
黄舟 2017-04-17 17:45:52
[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阻塞了?同时发出三条请求让后台处理才导致的?遇到这种情况只能加锁吗?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(2)
阿神

如果你不想出现重复数据应该将表加上unique constraint限制,这样重复插入会抛出unique constraint exception.

ALTER TABLE review_step_info ADD CONSTRAINT ux_review_step_info_pjtfsn_code
UNIQUE (pjtfsn, code)

不需要在java线程中加锁,应该对数据库进行加锁,这个依赖数据库的实现,你只需设置事务的隔离级别就可以。不知道你代码中上下文有无设置事务,如果没有,请一定设置,即使是全读的操作也应该要处于事务中。

session.beginTransaction();
// you code 
session.getTransaction().commit();

如果你使用spring-tx管理事务,也可以使用注解@Transactional(isolation=Isolation.SERIALIZABLE) 加在方法上。

客户端为何发送3个相同请求,这也是需要解决,但服务端应该保证即使客户端发疯,也要良好运作。

大家讲道理

加锁比较简单,但是性能不高。
建议使用数据库的事务,隔离读操作。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号