2024-5-14-从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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值