- DistributedLocks实现
- 自动注入数据源。创建连接,保证不影响其他连接。
- locked原子变量判断是否加锁成功;
- Executor 定时任务,尝试获取锁。
- init()初始化方法
使用注解@PostConstruct初始化,使用数据源创建连接。
开启定时任务,每隔5秒执行一次。
- tryLock()方法
尝试获取锁,获取成功,locked=true,否则为false。
- lock() 加锁
- 关闭自动提交事务;
- 设置事务隔离级别为RC;
- 设置锁超时时间innodb_lock_wait_timeout为5秒;
- 执行锁定语句for update加锁
- 事务不要commit或rollback,否则锁就释放了
- 根据locked状态判断是第一次获取到锁,还是后续的锁重入。
- closed()方法
使用@PreDestroy注解销毁bean时,连接回滚,并关闭。
- 测试
- 分别用端口9129和9130启动config-server
假如9129先启动,观察日志成功获取到锁了,并在定时任务重不断重入。
- 9130端口后启动,不会获取到锁,等待5秒后,抛出超时异常。
- 关闭9129,观察9130。可以自动获取到锁。
锁状态locked表示已经持有
源码:https://github.com/midnight2104/midnight-config/tree/v5