首页 > 其他分享 >多线程批量删除后再查询所遇到的坑

多线程批量删除后再查询所遇到的坑

时间:2022-09-26 10:01:22浏览次数:56  
标签:异步 批量 删除 查询 完毕 提交 多线程

问题:以前对于多线程异步执行没有细想,认为已经采用的countdownlatch,保证了任务全部执行完毕。实际上,并不是我认为的那样。

首先,一个方法是多线程异步批量删除数据,另一个方法是删除后再进行数据查询,通过查询的结果再进行分析。

写了一个方法,把删除再查询的方法写在一起,可是遇到问题。有写数据应该删除了,却被查出来了。经过分析发现,由于多线程异步执行,虽然每个任务都执行完毕,但是删除的数据还没提交,或者没提交完毕,导致查询的结果还存在。

最后想了一招,把删除的方法全部提交完毕后再进行查询,这样避免了以上的问题。

@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public void queryAndInsertWarningMsg() {
        // 首先进行数据清洗,去除掉配置的文件类型,然后再进行统计
        long startTime = System.currentTimeMillis();
        deleteLogsByDocType();
        log.warn("===预警生成前先执行删除日志用时"+(System.currentTimeMillis()-startTime)+"毫秒===========");
        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
            @Override
            public void afterCommit() {
          // 上面的删除方法 提交完毕后再进行如下的查询 queryAndInsertWarningMsgAfter(); } }); }

 

标签:异步,批量,删除,查询,完毕,提交,多线程
From: https://www.cnblogs.com/zhangliang88/p/16729874.html

相关文章