【分布式】分布式锁都有哪些实现方案?
一、业务场景 同一个jvm里多个线程操作同一个有状态的变量,可以通过JVM内的锁保证线程安全。 如果是多个JVM操作同一个有状态的变量,如何保证线程安全呢? 这时候就需要分布式锁来发挥它的作用了 二、特点 分布式系统往往业务流量比较大、并发较高,对分布式锁的高可用和高性能有较高的要求。一般分布式锁的方案需要满足如下要求: 有高可用的获取锁和释放锁功能 获取锁和释放锁的性能要好 这把锁要是一把可重入锁(避免死锁) 这把锁最好是一把阻塞锁(根据业务需求考虑要不要这条) 这把锁最好是一把公平锁(根据业务需求考虑要不要这条) 三、基于数据库的分布式锁方案 1、基于表主键唯一做分布式锁 利用主键唯一的特性,如果有多个请求同时提交到数据库的话,数据库会保证只有一个插入操作可以成功,那么我们就可以认为操作成功的那个线程获得了该方法的锁,当方法执行完毕之后,想要释放锁的话,删除这条数据库记录即可 1.1、缺点 数据库单点 没有锁超时机制 不可重入 非公平锁 非阻塞锁 1.2、优化点 数据库主从备份,解决单点问题。因为主从同步有延迟,可能导致数据不一致 定时任务检测锁超时自动释放或者通过 connection.commit() 操作来释放锁 加锁加上机器和线程信息,加锁之前先查询,支持可重入 中间表,记录加锁失败的机器线程,按照创建时间排序 自旋实现阻塞效果 1.3、原理