NutzCN Logo
问答 多线程中更新数据库出现问题
发布于 1483天前 作者 lalala 1913 次浏览 复制 上一个帖子 下一个帖子
标签:

在一个异步调用的方法中使用了更新操作
方法如下

  @Async(value = "downloadExecutor")
    public void handle(SpzwSimpleIllegalData record) {

        if (!downloadVideo(record)) {
            record.setLastDownloadDatetime(DateUtil.getSecondTimestamp(new Date()) + 600 * 15);
            illegalDataService.update(record);
            LOGGER.error("视频下载失败. fileCode:[{}] simpleIllegalDataId:[{}]", record.getFileCode(), record.getId());
            return;
        }

        record.setDownloadVideo(true);
        record.setDownloadVideoDatetime(DateUtil.getTimestamp());
        int count = illegalDataService.updateFields(record, "^(downloadVideo|downloadVideoDatetime|videoUrl1|videoUrl2)$");
}

在日志中count返回了1 但是数据库却没有更新成功 偶尔会出现这样子的情况,请问如何避免 或者是有什么方法可以实际监听是否已经更新完成了

11 回复

加个事务模板包起来

请问哪里有这方面的资料啊 找不到唉 或者指导一下怎么写啊

使用了Trans.exec 还是会出现那种情况 更新不了 sql也执行了 放在数据库中是没问题的

怎么加的?贴代码看看

单从代码看,不是多线程的问题

这逻辑到底啥意思,get/post分开处理的意思?

另外,@Async只能保证任务开始执行的顺序FIFO,但执行完成(及内部逻辑)的顺序是没有保证的

例如请求a/b/c,总是以abc这样的顺序插入线程池,但执行完成的顺序完全不可预知,除非async线程池的线程数设置为1


@Async(value = "downloadExecutor") public void handle(SpzwSimpleIllegalData record) { if (!downloadVideo(record)) { record.setLastDownloadDatetime(DateUtil.getSecondTimestamp(new Date()) + 600 * 15); illegalDataService.update(record); LOGGER.error("视频下载失败. fileCode:[{}] simpleIllegalDataId:[{}]", record.getFileCode(), record.getId()); return; } Integer result = Trans.exec(new Molecule<Integer>() { @Override public void run() { record.setDownloadVideo(true); record.setDownloadVideoDatetime(DateUtil.getTimestamp()); int count = illegalDataService.updateFields(record, "^(downloadVideo|downloadVideoDatetime|videoUrl1|videoUrl2)$"); setObj(count); } }); LOGGER.info("视频下载成功. -fileCode:[{}] -simpleIllegalDataId:[{}] -downloadDatetime:[{}] -updateCount:[{}]", record.getFileCode(), record.getId(),record.getDownloadVideoDatetime(),result); return; }

这是一个定时任务调用的方法,更新语句偶会更新失败

我觉得不是"更新失败", 是另外一个语句把这个语句的更新内容给覆盖了

另外的语句覆盖了 应该是只有两个语句 一个是上面的下载失败 但是lastDownloadDatetime按理来说应该有值才对,实际没值
更新失败的意思 数据还是跟原来的一样唉- -

updateCount是自增的量? 那要用Chain.makeSpecial/addSpecial来做, 生成的sql 是 updateCount=updateCount+1 形式的

添加回复
请先登陆
回到顶部