亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MyBatis 的一級緩存導(dǎo)致的數(shù)據(jù)一致性問題分析及解決方法

 更新時間:2025年06月24日 10:49:44   作者:小時候的陽光  
在MySQL提交讀隔離級別下,MyBatis一級緩存導(dǎo)致同一SqlSession內(nèi)重復(fù)查詢結(jié)果不更新,即使數(shù)據(jù)庫已變更,下面給大家介紹MyBatis 的一級緩存導(dǎo)致的數(shù)據(jù)一致性問題分析及解決方法,感興趣的朋友一起看看吧

問題說明

下面一段示例的業(yè)務(wù)邏輯代碼:

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
@Override
public void flushOrderDetail(FlushForm form) {
    // 構(gòu)建批量更新訂單狀態(tài)的參數(shù)集合
    List<FlushOrderParam> flushOrderParamList = payService.createFlushParam(form);
    // 查詢出本次需要更新的訂單記錄
    List<OrderEntity> orderList = orderService.query(form);
    SqlSession sqlSession = null;
    try {
        // 采用MyBatis批處理模式,開啟批量執(zhí)行的SqlSession
        sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
        // 批量處理訂單狀態(tài)信息
        orderService.batchUpdate(sqlSession, flushOrderParamList, orderList);
        // 提交批量處理事務(wù)
        sqlSession.commit();
    } catch (Exception e) {
        // 出現(xiàn)異常時,回滾批處理操作
        log.error("批處理訂單狀態(tài)失敗", e);
        if (sqlSession != null) sqlSession.rollback();
        // 將異常拋出,觸發(fā)Spring事務(wù)管理的回滾機制
        throw e;
    } finally {
        // 關(guān)閉SqlSession,釋放資源
        if (sqlSession != null) {
            try {
                sqlSession.close();
            } catch (Exception e) {
                log.error("關(guān)閉sqlSession異常", e);
            }
        }
    }
    // 批量操作成功后,再次查詢訂單,打印訂單狀態(tài)日志,便于排查和驗證
    orderList = orderService.query(form);
    for (OrderEntity order : orderList) {
        logger.debug("訂單 {} 狀態(tài) {}", order.getOrderCode(), order.getStatus());
    }
}

上面這段Spring業(yè)務(wù)代碼主要內(nèi)容就是想根據(jù)參數(shù)批量更新訂單狀態(tài),里面使用了Spring的事務(wù)注解,同時方法中另外開啟了一個數(shù)據(jù)庫會話用于批處理更新,這樣可以加快速度。

這段代碼連接的數(shù)據(jù)庫是 MySQL, 且事務(wù)隔離級別為 提交讀 (READ-COMMITTED),查詢MySQL事務(wù)隔離方法如下:

SELECT @@session.transaction_isolation;

問題現(xiàn)象:
orderList = orderService.query(form); 查詢出來的訂單狀態(tài)沒有變化,但是數(shù)據(jù)庫中已經(jīng)更新 !

問題原因

并非AI 給出的回答:因為兩個不同的事務(wù)管理器導(dǎo)致不一樣的結(jié)果…

首先,在提交讀的隔離級別下,即便不同的事務(wù)管理器也可以相互讀取到對方數(shù)據(jù)庫會話 已經(jīng)提交的事務(wù)數(shù)據(jù)

那為什么讀取到的最后狀態(tài)沒有變化? 因為 MyBatis 一級緩存導(dǎo)致

  • MyBatis 一級緩存默認綁定在一個 SqlSession 的生命周期內(nèi)下,
  • 上面代碼中的開頭和結(jié)尾的 orderService.query(form) 是在同一個SqlSession生命周期下
  • 且查詢參數(shù)一樣,這樣導(dǎo)致兩次查詢結(jié)果一樣,但數(shù)據(jù)庫中其實已經(jīng)狀態(tài)更新了

問題解決

修改一級緩存的隔離級別為 ·statement· 級別,這樣等同于關(guān)閉一級緩存。

mybatis:
  type-aliases-package: com.middol.*.model.**.dao
  mapper-locations: classpath:mapper/**/*Mapper.xml
  configuration:
    map-underscore-to-camel-case: true # 開啟駝峰功能
    local-cache-scope: statement

主要關(guān)注 local-cache-scope: statement

或者上面代碼放棄使用批處理模式,采用同一個SqlSession下操作數(shù)據(jù)庫,
或者直接使用批處理的SqlSession查詢訂單表。

到此,問題原因和處理說明完畢!

到此這篇關(guān)于MyBatis 的一級緩存導(dǎo)致的數(shù)據(jù)一致性問題分析的文章就介紹到這了,更多相關(guān)MyBatis一級緩存導(dǎo)致數(shù)據(jù)一致性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Boot中操作使用Redis實現(xiàn)詳解

    Spring Boot中操作使用Redis實現(xiàn)詳解

    Spring Boot與Redis結(jié)合使用,通過使用Spring Data Redis來實現(xiàn)對Redis的操作,實現(xiàn)數(shù)據(jù)緩存和高效存儲,提高應(yīng)用程序的性能和響應(yīng)速度??梢岳肧pring Boot自帶的Redis Starter方便地集成和配置Redis
    2023-04-04
  • springboot v2.0.3版本多數(shù)據(jù)源配置方法

    springboot v2.0.3版本多數(shù)據(jù)源配置方法

    這篇文章主要介紹了springboot v2.0.3版本多數(shù)據(jù)源配置方法,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2018-11-11
  • SpringCloud分布式鏈路跟蹤的方法

    SpringCloud分布式鏈路跟蹤的方法

    這篇文章主要介紹了SpringCloud分布式鏈路跟蹤的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • 深入剖析java中的集合框架

    深入剖析java中的集合框架

    下面小編就為大家?guī)硪黄钊肫饰鰆ava中的集合框架。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • spring boot + mybatis如何實現(xiàn)數(shù)據(jù)庫的讀寫分離

    spring boot + mybatis如何實現(xiàn)數(shù)據(jù)庫的讀寫分離

    這篇文章主要給大家介紹了關(guān)于spring boot + mybatis如何實現(xiàn)數(shù)據(jù)庫的讀寫分離的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • java連接mysql數(shù)據(jù)庫亂碼的解決方法

    java連接mysql數(shù)據(jù)庫亂碼的解決方法

    這篇文章主要介紹通過java連接mysql數(shù)據(jù)庫的時候,頁面出現(xiàn)亂碼,這里簡單分享下解決方法, 需要的朋友可以參考下
    2013-05-05
  • Java輸出鏈表倒數(shù)第k個節(jié)點

    Java輸出鏈表倒數(shù)第k個節(jié)點

    這篇文章主要介紹了Java輸出鏈表倒數(shù)第k個節(jié)點的相關(guān)內(nèi)容,涉及三種設(shè)計思路及代碼示例,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • SpringBoot實現(xiàn)前后端、json數(shù)據(jù)交互以及Controller接收參數(shù)的幾種常用方式

    SpringBoot實現(xiàn)前后端、json數(shù)據(jù)交互以及Controller接收參數(shù)的幾種常用方式

    這篇文章主要給大家介紹了關(guān)于SpringBoot實現(xiàn)前后端、json數(shù)據(jù)交互以及Controller接收參數(shù)的幾種常用方式,文中通過實例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-03-03
  • Java數(shù)據(jù)結(jié)構(gòu)之查找

    Java數(shù)據(jù)結(jié)構(gòu)之查找

    本文主要介紹了Java數(shù)據(jù)結(jié)構(gòu)中查找的相關(guān)知識。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • SpringBoot 統(tǒng)一功能處理方案

    SpringBoot 統(tǒng)一功能處理方案

    在我們進行項目編寫時,有時相同的一段代碼在不同的地方使用多次,對于這種情況,spring 幫我們實現(xiàn)了統(tǒng)一功能處理,下面介紹一些常用的統(tǒng)一功能處理,感興趣的朋友一起看看吧
    2025-04-04

最新評論