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. 获取锁