使用定時任務,導致多線程讀寫事務異常BUG

在使用定時任務時,先根據條件查詢出數據,然後對數據進行更新操作.出現BUG: 數據不知道,應該爲74條數據,在分頁查詢時會出現查詢數與實際條數不符情況. 歸結原因爲 : 多線程對查詢的結果進行了修改操作,導致查詢條件在查詢中改變導致.

解決辦法: 禁用分頁,只使用排序最新修改時間,取最新多少條數據.

@Component
public class TrackLogQuartz  implements SchedulingConfigurer {
    private final Logger logger = Logger.getLogger(TrackLogQuartz.class);
    @Value("${quartz.track.time}")
    private String quartzTime;
    @Autowired
    private TrackService trackService;
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addCronTask(this::run, quartzTime);
    }
    private void run() {
        int page = 0;
        int pageSize = 500;
        int count = 0;
        logger.info("開啓定時清理消息日誌");
        List<String> ids;
        do {
            ids = trackService.findByPage(page, pageSize);
            if (CollectionUtils.isNotEmpty(ids)) {
                count += trackService.deleteInId(ids);
            }
        } while (ids.size() >= pageSize);
        logger.info("結束定時清理消息日誌,共清理日誌" + count + "條");
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章