问题:以前对于多线程异步执行没有细想,认为已经采用的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