通過(guò)db創(chuàng)建分布式鎖

數(shù)據(jù)庫(kù)表

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 '業(yè)務(wù)鎖';

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

lock實(shí)體類(lèi)

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

    /**
     * 業(yè)務(wù)鎖
     */
    private String lockField;

    /**
     * 業(yè)務(wù)表
     */
    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層實(shí)現(xiàn)

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

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

implements實(shí)現(xiàn)

@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;
    }
}

通過(guò)service獲取到lock返回為true:表示拿到鎖,可以做業(yè)務(wù)操作,反知道不能做業(yè)務(wù)操作

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 說(shuō)到分布式系統(tǒng),不得不說(shuō)集中式系統(tǒng)。傳統(tǒng)集中式系統(tǒng)中整個(gè)項(xiàng)目所有的東西都在一個(gè)應(yīng)用里面。一個(gè)網(wǎng)站就是一個(gè)應(yīng)用...
    Java機(jī)械師閱讀 1,152評(píng)論 0 0
  • 最近碰到幾個(gè)業(yè)務(wù)場(chǎng)景,會(huì)遇到并發(fā)的問(wèn)題。在單實(shí)例情況下,我們會(huì)通過(guò)java.util.concurrent包...
    菜鳥(niǎo)小玄閱讀 2,327評(píng)論 0 5
  • 1 介紹 這篇博文講介紹如何一步步構(gòu)建一個(gè)基于Redis的分布式鎖。會(huì)從最原始的版本開(kāi)始,然后根據(jù)問(wèn)題進(jìn)行調(diào)整,最...
    Java黎先生閱讀 567評(píng)論 0 2
  • @[toc] 一、緩存 1、緩存使用 為了系統(tǒng)性能的提升,我們一般都會(huì)將部分?jǐn)?shù)據(jù)放入緩存中,加速訪問(wèn)。而db承擔(dān)數(shù)...
    runewbie閱讀 896評(píng)論 0 1
  • 學(xué)過(guò)Java多線程的應(yīng)該都知道什么是鎖,沒(méi)學(xué)過(guò)的也不用擔(dān)心,Java中的鎖可以簡(jiǎn)單的理解為多線程情況下訪問(wèn)臨界資源...
    小蘇c閱讀 266評(píng)論 0 0

友情鏈接更多精彩內(nèi)容