最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

1. 概述

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

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

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

2. 場景介紹

有一款商品,庫存只剩1件。

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

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

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

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

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

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

        // 減庫存
        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() {

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

        // 減庫存
        productRepository.reductCount();

        // 生成訂單
        createOrder();
    }

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

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

因?yàn)殡m然方法被鎖住了,可是@Transactional 注解并沒有及時的提交事務(wù),導(dǎo)致庫存沒有及時扣減為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 {
            // 查看是商品否有庫存
            Integer count = getProductCount();
            if(count <= 0) {
                throw new RuntimeException("庫存為 0");
            }

            // 減庫存
            productRepository.reductCount();

            // 生成訂單
            createOrder();

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

    }

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

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

4. 綜述

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

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

相關(guān)文章

  • Java導(dǎo)出txt文件的方法

    Java導(dǎo)出txt文件的方法

    這篇文章主要介紹了Java導(dǎo)出txt文件的方法,實(shí)例分析了兩種java導(dǎo)出txt文本文件的使用技巧,需要的朋友可以參考下
    2015-05-05
  • java jdbc連接和使用詳細(xì)介紹

    java jdbc連接和使用詳細(xì)介紹

    這篇文章主要介紹了 java jdbc連接和使用詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • 詳解Mybatis Generator的具體使用教程

    詳解Mybatis Generator的具體使用教程

    Mybatis Generator可以幫助我們自動生成很多結(jié)構(gòu)化的代碼,比如每張表對應(yīng)的Entity、Mapper接口和Xml文件,可以省去很多繁瑣的工作,今天通過本文給大家介紹Mybatis Generator的具體使用教程,感興趣的朋友一起看看吧
    2022-02-02
  • SpringBoot解決406錯誤之返回對象缺少Getter/Setter方法引發(fā)的問題

    SpringBoot解決406錯誤之返回對象缺少Getter/Setter方法引發(fā)的問題

    在Spring Boot開發(fā)中,接口請求返回?cái)?shù)據(jù)是系統(tǒng)交互的重要環(huán)節(jié),然而,開發(fā)過程中常常會遇到由于數(shù)據(jù)類型或返回格式問題導(dǎo)致的錯誤,其中最常見的就是406 Not Acceptable異常,本篇文章以實(shí)際的案例出發(fā),詳細(xì)分析在POST請求中產(chǎn)生406錯誤的原因
    2024-11-11
  • Java 5個人坐在一起(有關(guān)第五個人歲數(shù)的問題)

    Java 5個人坐在一起(有關(guān)第五個人歲數(shù)的問題)

    利用遞歸的方法,遞歸分為回推和遞推兩個階段。要想知道第五個人歲數(shù),需知道第四人的歲數(shù),依次類推,推到第一人(10歲),再往回推,需要的朋友可以參考下
    2017-02-02
  • Java文檔注釋用法+JavaDoc的使用說明

    Java文檔注釋用法+JavaDoc的使用說明

    這篇文章主要介紹了Java文檔注釋用法+JavaDoc的使用說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • HDFS的Java API的訪問方式實(shí)例代碼

    HDFS的Java API的訪問方式實(shí)例代碼

    這篇文章主要介紹了HDFS的Java API的訪問方式實(shí)例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • Java JFinal框架中實(shí)現(xiàn)添加定時任務(wù)功能詳解

    Java JFinal框架中實(shí)現(xiàn)添加定時任務(wù)功能詳解

    這篇文章主要為大家詳細(xì)介紹了如何在JFinal框架項(xiàng)目中添加定時任務(wù)的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-02-02
  • Mybatis調(diào)用Oracle存儲過程的方法圖文詳解

    Mybatis調(diào)用Oracle存儲過程的方法圖文詳解

    這篇文章主要介紹了Mybatis調(diào)用Oracle存儲過程的方法介紹,需要的朋友可以參考下
    2017-09-09
  • Java語言通過三種方法實(shí)現(xiàn)隊(duì)列的示例代碼

    Java語言通過三種方法實(shí)現(xiàn)隊(duì)列的示例代碼

    這篇文章主要介紹了Java語言通過三種方法來實(shí)現(xiàn)隊(duì)列的實(shí)例代碼,數(shù)組模擬隊(duì)列,通過對定義的了解,發(fā)現(xiàn)隊(duì)列很像我們的數(shù)組,下面我們通過實(shí)踐給大家詳細(xì)介紹,需要的朋友可以參考下
    2022-02-02

最新評論

湘潭县| 阳原县| 乌海市| 加查县| 敦煌市| 龙井市| 额济纳旗| 文化| 博湖县| 中西区| 天长市| 浦县| 杨浦区| 孟连| 阳城县| 建德市| 台安县| 长宁区| 泰州市| 汽车| 伊吾县| 宁国市| 永济市| 信宜市| 平凉市| 凌源市| 昆山市| 麻栗坡县| 云浮市| 延边| 三门峡市| 常宁市| 无锡市| 鹤岗市| 吉隆县| 镇江市| 独山县| 马边| 东港市| 时尚| 马鞍山市|