MySQL实现分布式锁

1. 建表
 ···

CREATE TABLE data_import_lock (
id bigint(20) NOT NULL AUTO_INCREMENT,
key varchar(255) DEFAULT NULL,
node varchar(255) DEFAULT NULL,
create_time datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
update_time datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uni_key (key) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=61 DEFAULT CHARSET=utf8
···
key必须是唯一索引,node用于表示当前持有锁的节点。

 2. 释放锁

(1)程序意外退出时释放自己持有的锁(main函数中编写shutdown钩子函数):

        DataImportLockService dataImportLockService = context.getBean(DataImportLockService.class);
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            dataImportLockService.releaseOwnLock("DATA_IMPORT_LOCK");
        }));

(2)对于超过一天的,非自己持有的锁,直接释放,防止有的节点意外退出没有释放锁,而导致其他节点一直无法获取锁。
(3)当前节点获取锁后,执行的业务正常结束后,释放锁。

 3. 获取锁 
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、常现的分布式锁 分布式锁在如今最常见的有3种实现方式: 1、数据库 2、缓存 3、Zookeeper 二、常现...
    SpiritWang阅读 1,061评论 0 1
  • 基于数据库表 要实现分布式锁,最简单的方式就是直接创建一张锁表,然后通过操作该表中的数据来实现加锁和解锁。当要锁住...
    杜子龙阅读 6,107评论 0 0
  • 纯数据库表实现方式 首先创建一张表: 当我们想要锁住某个方法时,执行以下SQL:insert into metho...
    炫迈哥阅读 8,041评论 0 2
  • 转载自(Tank丶Farmer) 在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式...
    可爸阅读 402评论 0 0
  • 最近碰到几个业务场景,会遇到并发的问题。在单实例情况下,我们会通过java.util.concurrent包...
    菜鸟小玄阅读 2,319评论 0 5

友情链接更多精彩内容