91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Springboot在有鎖的情況下怎么正確使用事務

發布時間:2021-12-17 16:06:25 來源:億速云 閱讀:164 作者:iii 欄目:開發技術

這篇文章主要介紹“Springboot在有鎖的情況下怎么正確使用事務”,在日常操作中,相信很多人在Springboot在有鎖的情況下怎么正確使用事務問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Springboot在有鎖的情況下怎么正確使用事務”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

1. 概述

老話說的好:想要賺錢,就去看看有錢人有什么需求,因為有錢人錢多,所以賺的多。

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

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

2. 場景介紹

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

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

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

3. 代碼實現

3.1 不加鎖的代碼實現

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

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

        // 減庫存
        productRepository.reductCount();

        // 生成訂單
        createOrder();
    }

首先我們正常編寫業務邏輯,用 @Transactional 注解控制事務。

經并發實驗,產生了超賣的現象。

3.2 加鎖的代碼實現

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

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

        // 減庫存
        productRepository.reductCount();

        // 生成訂單
        createOrder();
    }

這次我們使用 synchronized 關鍵字給方法加了把“鎖”,理論上應該不會產生超賣現象了吧。

經實驗,仍然產生了超賣現象。

因為雖然方法被鎖住了,可是@Transactional 注解并沒有及時的提交事務,導致庫存沒有及時扣減為0,因此還是超賣了。

3.3 正確使用事務的代碼實現

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

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

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

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

            // 減庫存
            productRepository.reductCount();

            // 生成訂單
            createOrder();

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

    }

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

經實驗,解決了超賣現象。

到此,關于“Springboot在有鎖的情況下怎么正確使用事務”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

伊宁市| 昌都县| 雷山县| 鄂伦春自治旗| 长沙县| 房产| 张北县| 柘荣县| 上思县| 永宁县| 芷江| 高碑店市| 玉林市| 竹溪县| 潼南县| 新津县| 连城县| 金门县| 龙岩市| 宜丰县| 二连浩特市| 茶陵县| 松原市| 华池县| 修武县| 同仁县| 盖州市| 南岸区| 涞源县| 洪江市| 泾阳县| 沙洋县| 白河县| 正定县| 红安县| 兴宁市| 肃南| 千阳县| 湖口县| 玛纳斯县| 盐亭县|