使用@SchedulerLock可以实现比较轻量级的简单的定时任务,也可以实现分布式锁,那具体的原理是啥?
具体的原理是维护了一个数据库表,主键是不可重复的,然后利用主键不可重复的特性,实现了锁的抢占.
获取锁逻辑
INSERT INTO tableName (name, lock_until, locked_at, locked_by) VALUES(锁名字, 当前时间+最多锁多久, 当前时间, 主机名)
如果插入成功了,就说明抢到了锁,否则任务抢不到锁.
如果记录已经存在了,就用更新记录来抢锁.