需求
我们测试环境有多台机器,我们有个重试的定时任务,本地执行是没问题,但是发到测试环境,我们就有问题了。测试环境是三个机器。三个节点,那岂不是同一时间执行了三次吗。我们要解决这个问题
其他实现
前几天我们使用了update锁的修改状态,我们今天用version去做这个乐观锁
代码
首先在启动类加@EnableScheduling
要不然定时任务不起作用
接着就是定时任务了
@Scheduled(cron = "0/10 * * * * ? ")
public void scheduledVersion(){
ScheduleVersion one = versionService.getOne(new LambdaQueryWrapper<ScheduleVersion>().eq(ScheduleVersion::getLockKey,"versionKeyLock"));
log.info("one:{}",one.toString());
// update version
int updateRow = versionService.getLock(one);
if (updateRow>0){
log.info("getLock");
try{
// do something
}finally {
}
}else{
log.info("no get the lock. do nothing");
}
}
getLock
<update id="getLock">
update ecm_schedule_version
set lock_status=1,
version = #{version} + 1
where version = #{version}
and lock_key = #{lockKey}
</update>
感觉
感觉这个version去处理比较方便,最后也不用去释放。update成功就是拿到锁
弊端
但是感觉version一直在加,怕这个字段会很大,定时任务没那么频繁的感觉可以用这个,比较简单
表结构
CREATE TABLE `ecm_schedule_version` (
`id` int NOT NULL AUTO_INCREMENT,
`lock_status` int NOT NULL DEFAULT '0',
`lock_key` varchar(255) NOT NULL,
`version` int DEFAULT '0',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci