使用数据库乐观锁在多节点机器上进行定时任务防止重复执行

需求

我们测试环境有多台机器,我们有个重试的定时任务,本地执行是没问题,但是发到测试环境,我们就有问题了。测试环境是三个机器。三个节点,那岂不是同一时间执行了三次吗。我们要解决这个问题

其他实现

前几天我们使用了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
  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值