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

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

 更新時(shí)間:2025年06月24日 10:49:44   作者:小時(shí)候的陽(yáng)光  
在MySQL提交讀隔離級(jí)別下,MyBatis一級(jí)緩存導(dǎo)致同一SqlSession內(nèi)重復(fù)查詢結(jié)果不更新,即使數(shù)據(jù)庫(kù)已變更,下面給大家介紹MyBatis 的一級(jí)緩存導(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)異常時(shí),回滾批處理操作
        log.error("批處理訂單狀態(tài)失敗", e);
        if (sqlSession != null) sqlSession.rollback();
        // 將異常拋出,觸發(fā)Spring事務(wù)管理的回滾機(jī)制
        throw e;
    } finally {
        // 關(guān)閉SqlSession,釋放資源
        if (sqlSession != null) {
            try {
                sqlSession.close();
            } catch (Exception e) {
                log.error("關(guān)閉sqlSession異常", e);
            }
        }
    }
    // 批量操作成功后,再次查詢訂單,打印訂單狀態(tài)日志,便于排查和驗(yàn)證
    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í)方法中另外開啟了一個(gè)數(shù)據(jù)庫(kù)會(huì)話用于批處理更新,這樣可以加快速度。

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

SELECT @@session.transaction_isolation;

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

問題原因

并非AI 給出的回答:因?yàn)閮蓚€(gè)不同的事務(wù)管理器導(dǎo)致不一樣的結(jié)果…

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

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

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

問題解決

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

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

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

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

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

相關(guān)文章

  • SpringMVC中RequestMapping注解(作用、出現(xiàn)的位置、屬性)

    SpringMVC中RequestMapping注解(作用、出現(xiàn)的位置、屬性)

    這篇文章主要介紹了SpringMVC中RequestMapping注解(作用、出現(xiàn)的位置、屬性),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • MyBatis-Plus多數(shù)據(jù)源配置與讀寫分離全過程

    MyBatis-Plus多數(shù)據(jù)源配置與讀寫分離全過程

    文章介紹了如何在SpringBoot中使用MyBatis-Plus實(shí)現(xiàn)多數(shù)據(jù)庫(kù)操作,包括純粹多庫(kù)和讀寫分離的配置方法,重點(diǎn)演示了多數(shù)據(jù)源的設(shè)置與使用
    2025-09-09
  • 詳解Java注解的實(shí)現(xiàn)與使用方法

    詳解Java注解的實(shí)現(xiàn)與使用方法

    這篇文章主要介紹了詳解Java注解的實(shí)現(xiàn)與使用方法的相關(guān)資料,希望通過本文大家能夠理解掌握J(rèn)ava注解的知識(shí),需要的朋友可以參考下
    2017-09-09
  • java 正則表達(dá)式獲取兩個(gè)字符中間的字符串方法

    java 正則表達(dá)式獲取兩個(gè)字符中間的字符串方法

    今天小編就為大家分享一篇java 正則表達(dá)式獲取兩個(gè)字符中間的字符串方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Windows系統(tǒng)下如何查找JDK的安裝路徑

    Windows系統(tǒng)下如何查找JDK的安裝路徑

    這篇文章主要介紹了Windows系統(tǒng)下如何查找JDK的安裝路徑,文中介紹了三種方法,分別是通過命令行檢查、使用verbose選項(xiàng)查找jre目錄、以及查看環(huán)境變量,需要的朋友可以參考下
    2025-03-03
  • Java實(shí)現(xiàn)為PDF批量添加圖片水印實(shí)用指南

    Java實(shí)現(xiàn)為PDF批量添加圖片水印實(shí)用指南

    在數(shù)字化辦公日益普及的今天,PDF文檔作為信息傳輸和共享的重要載體,其安全性和版權(quán)保護(hù)變得尤為關(guān)鍵,本文將介紹如何使用Spire.PDF?for?Java輕松地在Java應(yīng)用程序中為PDF文檔添加圖片水印,有需要的可以參考下
    2025-11-11
  • 使用自定義Json注解實(shí)現(xiàn)輸出日志字段脫敏

    使用自定義Json注解實(shí)現(xiàn)輸出日志字段脫敏

    這篇文章主要介紹了使用自定義Json注解實(shí)現(xiàn)輸出日志字段脫敏,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Spring中Xml屬性配置的解析全過程記錄

    Spring中Xml屬性配置的解析全過程記錄

    這篇文章主要給大家介紹了關(guān)于Spring中Xml屬性配置的解析全過程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • idea添加自定義的todo實(shí)現(xiàn)過程

    idea添加自定義的todo實(shí)現(xiàn)過程

    本文主要介紹了在開發(fā)過程中使用自定義TODO標(biāo)識(shí)的重要性,以及在IntelliJ IDEA中如何創(chuàng)建自定義TODO、設(shè)置快捷鍵、過濾器等操作的具體步驟和方法
    2026-05-05
  • java通過jni調(diào)用opencv處理圖像的方法

    java通過jni調(diào)用opencv處理圖像的方法

    今天小編就為大家分享一篇java通過jni調(diào)用opencv處理圖像的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08

最新評(píng)論

区。| 天津市| 广州市| 四子王旗| 孟津县| 河源市| 东乌| 司法| 桐庐县| 龙泉市| 大石桥市| 廊坊市| 乌拉特前旗| 沾化县| 东明县| 陈巴尔虎旗| 晋州市| 佛坪县| 龙川县| 靖宇县| 连南| 澄江县| 峡江县| 博野县| 富蕴县| 荣成市| 健康| 蕲春县| 井陉县| 佛山市| 河间市| 桂林市| 仙游县| 玛纳斯县| 贵定县| 镇赉县| 沙坪坝区| 颍上县| 康定县| 峨山| 信阳市|