bug:定时任务因数据库时间滞后导致数据清理失效问题

问题背景:

在数据清理定时任务中,发现理应被删除的数据未被正确清理。

经排查发现:

  • 定时任务配置在每日00:00:00执行
  • 删除数据SQL语句逻辑正常
  • 应用服务器时间准确
  • 数据库服务器时间比应用服务器慢15秒
  • 数据清理SQL使用CURDATE()获取当前日期

问题原因分析:

当应用服务器在00:00:00触发任务时:

  • 应用服务器时间:2025-07-18 00:00:00
  • 数据库服务器时间:2025-07-17 23:59:45(滞后15秒)
  • SQL中CURDATE()返回:2025-07-17(而非预期的2025-07-18)
  • 数据清理条件计算为DATE_SUB(‘2025-07-17’, INTERVAL 12 MONTH)
  • 实际应计算为DATE_SUB(‘2025-07-18’, INTERVAL 12 MONTH)

解决方案:

应用层传递时间参数

// Service层
public Long cleanExpiredRecords() {
    // 使用应用服务器时间
    Date currentDate = new Date(); 
    return recordMapper.deleteExpiredRecords(currentDate);
}

// Mapper接口
@Delete("DELETE FROM data_records " +
        "WHERE  update_time < DATE_SUB(#{currentDate}, INTERVAL 12 MONTH)")
Long deleteExpiredRecords(@Param("currentDate") Date currentDate);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值