数据库同步锁实现

一.使用场景

对于多线程的集群环境,同一段代码逻辑我们不希望多个线程同时执行的时候,我们可以使用数据库锁来实现线程的控制

二.场景例子

最近做了一个数据同步的逻辑,就是将第三方接口的数据同步到本地,可以手动同步,可以定时自动同步,这时候我需要考虑在同一个时间点不可以有两个线程同时执行这个同步逻辑。
同时 我们不仅仅需要考虑同一台服务器是否会存在同时运行这条线程,我们还需要考虑集群服务器是否会同时运行这条线程,这时候我们需要引入数据库锁
原因

  1. 一个线程已经执行逻辑,不需要重复执行,可能会造成数据库数据的重复读脏读

  2. 因为调用接口获取的数据量比较大,同时同步会占用服务器的内存和cpu性能,影响应用的正常使用速度

  3. 第三方接口调用有频率限制,多次调用可能会出现接口调用频率超时导致无法同步的情况

三.具体实现

1.数据建一张同步状态表 如 sync_status_set 表
关键字段
sync_status 同步状态 此字段来当数据库锁,来控制线程的执行
如 0-未同步 1-正在同步 2-同步结束
基本字段
create_time 创建时间
update_time 修改时间
create_user_id 创建人id
update_user_id 更新人id

2.代码逻辑处理
1.开启线程,获取同步状态设置
2.判断同步状态

  • sync_status == null || sync_status == 0 则插入同步数据 设置sync_stauts = 1
  • sync_status == 1 代表有线程正在同步 停止当前线程 更新修改时间 修改人员id
  • sync_status == 2 同步结束,创建新建的同步状态 设置创建时间

结语:此为集群环境,保证一段逻辑在一个时间段只能单线程执行的实现方式之一 可能不是完美的处理方式,如果有更好的方式欢迎提出讨论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值