欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Springboot在有鎖的情況下正確使用事務(wù)的實(shí)現(xiàn)代碼

 更新時(shí)間:2021年12月17日 14:33:35   作者:追風(fēng)人聊Java  
這篇文章主要介紹了Springboot在有鎖的情況下如何正確使用事務(wù),今天通過一個(gè)實(shí)驗(yàn)給大家分析一下商品超賣問題,模擬場(chǎng)景分析通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下

1. 概述

老話說的好:想要賺錢,就去看看有錢人有什么需求,因?yàn)橛绣X人錢多,所以賺的多。

言歸正傳,在Java項(xiàng)目的研發(fā)中,“鎖”這個(gè)詞并不陌生,最經(jīng)典的使用場(chǎng)景是商品的超賣問題。

很多Java小白,通常會(huì)認(rèn)為,給代碼加上一把“鎖”,就能解決多扣庫(kù)存問題,卻忽略了數(shù)據(jù)庫(kù)事務(wù)的問題,今天我們就來做一個(gè)實(shí)驗(yàn),分析一下商品超賣問題。

2. 場(chǎng)景介紹

有一款商品,庫(kù)存只剩1件。

購(gòu)買商品時(shí),做三個(gè)動(dòng)作,一是檢查庫(kù)存,二是扣庫(kù)存,三是生成訂單,三個(gè)動(dòng)作在一個(gè)事務(wù)中執(zhí)行。

模擬并發(fā)場(chǎng)景,使用10個(gè)線程同時(shí)執(zhí)行用戶購(gòu)買商品的操作。

3. 代碼實(shí)現(xiàn)

3.1 不加鎖的代碼實(shí)現(xiàn)

@Transactional(rollbackFor = Exception.class)
    public void buy() {

        // 查看是商品否有庫(kù)存
        Integer count = getProductCount();
        if(count <= 0) {
            throw new RuntimeException("庫(kù)存為 0");
        }

        // 減庫(kù)存
        productRepository.reductCount();

        // 生成訂單
        createOrder();
    }

首先我們正常編寫業(yè)務(wù)邏輯,用 @Transactional 注解控制事務(wù)。

經(jīng)并發(fā)實(shí)驗(yàn),產(chǎn)生了超賣的現(xiàn)象。

3.2 加鎖的代碼實(shí)現(xiàn)

@Transactional(rollbackFor = Exception.class)
    public synchronized void buy() {

        // 查看是商品否有庫(kù)存
        Integer count = getProductCount();
        if(count <= 0) {
            throw new RuntimeException("庫(kù)存為 0");
        }

        // 減庫(kù)存
        productRepository.reductCount();

        // 生成訂單
        createOrder();
    }

這次我們使用 synchronized 關(guān)鍵字給方法加了把“鎖”,理論上應(yīng)該不會(huì)產(chǎn)生超賣現(xiàn)象了吧。

經(jīng)實(shí)驗(yàn),仍然產(chǎn)生了超賣現(xiàn)象。

因?yàn)殡m然方法被鎖住了,可是@Transactional 注解并沒有及時(shí)的提交事務(wù),導(dǎo)致庫(kù)存沒有及時(shí)扣減為0,因此還是超賣了。

3.3 正確使用事務(wù)的代碼實(shí)現(xiàn)

@Autowired
    private PlatformTransactionManager platformTransactionManager;
    @Autowired
    private TransactionDefinition transactionDefinition;

    // @Transactional(rollbackFor = Exception.class)
    public synchronized void buy() {

        // 開啟事務(wù)
        TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);

        try {
            // 查看是商品否有庫(kù)存
            Integer count = getProductCount();
            if(count <= 0) {
                throw new RuntimeException("庫(kù)存為 0");
            }

            // 減庫(kù)存
            productRepository.reductCount();

            // 生成訂單
            createOrder();

            // 事務(wù)提交
            platformTransactionManager.commit(transactionStatus);
        } catch (Exception ex) {
            log.error(ex.getMessage(), ex);
            // 事務(wù)回滾
            platformTransactionManager.rollback(transactionStatus);
        }

    }

這次我們不使用@Transactional 注解管理事務(wù)了,改為手動(dòng)管理事務(wù)。

經(jīng)實(shí)驗(yàn),解決了超賣現(xiàn)象。

4. 綜述

今天聊了一下 Springboot在有鎖的情況下如何正確使用事務(wù),希望可以對(duì)大家的工作有所幫助。

到此這篇關(guān)于Springboot在有鎖的情況下如何正確使用事務(wù)的文章就介紹到這了,更多相關(guān)Springboot使用事務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何理解和運(yùn)用ClassLoader

    如何理解和運(yùn)用ClassLoader

    這篇文章主要介紹了如何理解和運(yùn)用 ClassLoader,幫助大家更好的理解和使用JVM,感興趣的朋友可以了解下
    2021-01-01
  • java使用Base64編碼實(shí)例

    java使用Base64編碼實(shí)例

    這篇文章主要介紹了java使用Base64編碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java定義泛型方法實(shí)例分析

    Java定義泛型方法實(shí)例分析

    這篇文章主要介紹了Java定義泛型方法,結(jié)合實(shí)例形式分析了java定義泛型的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2019-07-07
  • Java13 明天發(fā)布(最新最全新特性解讀)

    Java13 明天發(fā)布(最新最全新特性解讀)

    這篇文章主要介紹了Java13 明天發(fā)布,最新最全新特性解讀,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • java 數(shù)據(jù)的加密與解密普遍實(shí)例代碼

    java 數(shù)據(jù)的加密與解密普遍實(shí)例代碼

    本篇文章介紹了一個(gè)關(guān)于密鑰查詢的jsp文件簡(jiǎn)單實(shí)例代碼,需要的朋友可以參考下
    2017-04-04
  • Java構(gòu)建樹形菜單的實(shí)例代碼(支持多級(jí)菜單)

    Java構(gòu)建樹形菜單的實(shí)例代碼(支持多級(jí)菜單)

    這篇文章主要介紹了Java構(gòu)建樹形菜單的實(shí)例代碼(支持多級(jí)菜單),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-09-09
  • 使用kafka如何選擇分區(qū)數(shù)及kafka性能測(cè)試

    使用kafka如何選擇分區(qū)數(shù)及kafka性能測(cè)試

    這篇文章主要介紹了使用kafka如何選擇分區(qū)數(shù)及kafka性能測(cè)試,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • spring boot與redis 實(shí)現(xiàn)session共享教程

    spring boot與redis 實(shí)現(xiàn)session共享教程

    這篇文章主要介紹了spring boot與redis 實(shí)現(xiàn)session共享教程,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-04-04
  • JAVA多線程與并發(fā)學(xué)習(xí)總結(jié)分析

    JAVA多線程與并發(fā)學(xué)習(xí)總結(jié)分析

    以下是對(duì)小編對(duì)JAVA多線程與并發(fā)的學(xué)習(xí)進(jìn)行了總結(jié)介紹,需要的朋友可以過來參考下
    2013-08-08
  • 非常全面的Java?SpringBoot點(diǎn)贊功能實(shí)現(xiàn)

    非常全面的Java?SpringBoot點(diǎn)贊功能實(shí)現(xiàn)

    但是這些功能再項(xiàng)目中是高頻出現(xiàn)的,如果直接操作數(shù)據(jù)庫(kù)的話,對(duì)數(shù)據(jù)庫(kù)壓力太大。那遇到這個(gè)問題怎么解決?這篇文章主要給大家介紹了關(guān)于Java?SpringBoot點(diǎn)贊功能實(shí)現(xiàn)?的相關(guān)資料,需要的朋友可以參考下
    2022-01-01

最新評(píng)論