一.使用场景
对于多线程的集群环境,同一段代码逻辑我们不希望多个线程同时执行的时候,我们可以使用数据库锁来实现线程的控制
二.场景例子
最近做了一个数据同步的逻辑,就是将第三方接口的数据同步到本地,可以手动同步,可以定时自动同步,这时候我需要考虑在同一个时间点不可以有两个线程同时执行这个同步逻辑。
同时 我们不仅仅需要考虑同一台服务器是否会存在同时运行这条线程,我们还需要考虑集群服务器是否会同时运行这条线程,这时候我们需要引入数据库锁
原因
-
一个线程已经执行逻辑,不需要重复执行,可能会造成数据库数据的重复读脏读
-
因为调用接口获取的数据量比较大,同时同步会占用服务器的内存和cpu性能,影响应用的正常使用速度
-
第三方接口调用有频率限制,多次调用可能会出现接口调用频率超时导致无法同步的情况
三.具体实现
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 同步结束,创建新建的同步状态 设置创建时间
结语:此为集群环境,保证一段逻辑在一个时间段只能单线程执行的实现方式之一 可能不是完美的处理方式,如果有更好的方式欢迎提出讨论