97.xxl-job集群如何保证任务不被重复执行各定时任务节点执行时,会从数据库中取触发器执行。使用数据库锁,“select * from xxl_job_lock where lock_name = 'schedule_lock' for update”,同一时间只有一台服务器能查询到需要执行的任务。for update,防止了集群同时调度的情况。并且该任务执行完以后,会更新下次执行时间。然后才释放锁。PS:会读取当前时间至往后5s内的数据,以及处理过期未执行的数据。极端情况下:所以如果两台服务器每1秒执行一次job1任务。两台服务器时间不一致且差距在5s内,就会重复执行。如 A时间为1:00:00,B时间为1:00:04.此时B执行完job1,并将下次执行时间定为1s后,1:00:05,执行完毕释放锁。A获取数据库锁,查询需要执行的任务,就会查到(1:00:00+5s=1:00:05)的这条任务。所以同1秒内,A还会在调一次。就出现了任务被重复执行的情况解决方法:把两台服务器时间设置在5s及以上,但这样,慢的那台服务器就永远查不到需要执行的任务了,也失去了集群的意义。