通过db创建分布式锁

数据库表

create table if not exists yw_lock
(
    lock_field varchar(50) not null,
    lock_table varchar(50) not null,
    constraint pk_yw_lock
        primary key (lock_field, lock_table)
);

comment on table yw_lock is '分布式锁';

comment on column yw_lock.lock_field is '业务锁';

create index if not exists index_yw_lock_all
    on yw_lock (lock_field, lock_table);

lock实体类

@Data
@EqualsAndHashCode
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "yw_lock")
public class YwLock implements Serializable {

    /**
     * 业务锁
     */
    private String lockField;

    /**
     * 业务表
     */
    private String lockTable;

}

public interface YwLockMapper {
    int lock(YwLock ywLock);
    int unLock(YwLock ywLock);
}

<insert id="lock" parameterType="YwLock">
     INSERT INTO yw_lock (
        lock_field,
        lock_table
      ) VALUES (
        #{lockField},
        #{lockTable}
     );
</insert>

<delete id="unLock" parameterType="YwLock">
    DELETE
    FROM yw_lock
    WHERE lock_field = #{lockField} and lock_table = #{lockTable}
</delete>

Service层实现

public interface IYwLockService {
    /**
     * 加锁
     */
    boolean lock(YwLock ywLock);

    /**
     * 解锁
     */
    boolean unLock(YwLock ywLock);
}

implements实现

@Service
public class YwLockServiceImpl implements IYwLockService {

    @Resource
    private YwLockMapper lockMapper;

    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public boolean lock(YwLock ywLock) {
        return lockMapper.lock(ywLock) > 0;
    }

    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public boolean unLock(YwLock ywLock) {
        return lockMapper.unLock(ywLock) > 0;
    }
}

通过service获取到lock返回为true:表示拿到锁,可以做业务操作,反知道不能做业务操作

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

相关阅读更多精彩内容

  • 前言 说到分布式系统,不得不说集中式系统。传统集中式系统中整个项目所有的东西都在一个应用里面。一个网站就是一个应用...
    Java机械师阅读 4,704评论 0 0
  • 最近碰到几个业务场景,会遇到并发的问题。在单实例情况下,我们会通过java.util.concurrent包...
    菜鸟小玄阅读 6,691评论 0 5
  • 1 介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁。会从最原始的版本开始,然后根据问题进行调整,最...
    Java黎先生阅读 3,411评论 0 2
  • @[toc] 一、缓存 1、缓存使用 为了系统性能的提升,我们一般都会将部分数据放入缓存中,加速访问。而db承担数...
    runewbie阅读 4,249评论 0 1
  • 学过Java多线程的应该都知道什么是锁,没学过的也不用担心,Java中的锁可以简单的理解为多线程情况下访问临界资源...
    小苏c阅读 1,616评论 0 0

友情链接更多精彩内容