从0到1手写配置中心config之基于数据库的分布式锁

  1. DistributedLocks实现
  • 自动注入数据源。创建连接,保证不影响其他连接。
  • locked原子变量判断是否加锁成功;
  • Executor 定时任务,尝试获取锁。

图片

  1. init()初始化方法

使用注解@PostConstruct初始化,使用数据源创建连接。

开启定时任务,每隔5秒执行一次。

图片

  1. tryLock()方法

尝试获取锁,获取成功,locked=true,否则为false。

图片

  1. lock() 加锁
  • 关闭自动提交事务;
  • 设置事务隔离级别为RC;
  • 设置锁超时时间innodb_lock_wait_timeout为5秒;
  • 执行锁定语句for update加锁
  • 事务不要commit或rollback,否则锁就释放了
  • 根据locked状态判断是第一次获取到锁,还是后续的锁重入。

图片

  1. closed()方法

使用@PreDestroy注解销毁bean时,连接回滚,并关闭。

图片

  1. 测试
  • 分别用端口9129和9130启动config-server

假如9129先启动,观察日志成功获取到锁了,并在定时任务重不断重入。

图片

  • 9130端口后启动,不会获取到锁,等待5秒后,抛出超时异常。

图片

  • 关闭9129,观察9130。可以自动获取到锁。

图片

锁状态locked表示已经持有

图片

源码:https://github.com/midnight2104/midnight-config/tree/v5