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

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

 更新時(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ù)一致性問(wèn)題分析及解決方法,感興趣的朋友一起看看吧

問(wèn)題說(shuō)明

下面一段示例的業(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批處理模式,開(kāi)啟批量執(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í)方法中另外開(kāi)啟了一個(gè)數(shù)據(jù)庫(kù)會(huì)話用于批處理更新,這樣可以加快速度。

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

SELECT @@session.transaction_isolation;

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

問(wèn)題原因

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

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

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

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

問(wèn)題解決

修改一級(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 # 開(kāi)啟駝峰功能
    local-cache-scope: statement

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

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

到此,問(wèn)題原因和處理說(shuō)明完畢!

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

相關(guān)文章

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

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

    Spring Boot與Redis結(jié)合使用,通過(guò)使用Spring Data Redis來(lái)實(shí)現(xiàn)對(duì)Redis的操作,實(shí)現(xiàn)數(shù)據(jù)緩存和高效存儲(chǔ),提高應(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ù)源配置方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2018-11-11
  • SpringCloud分布式鏈路跟蹤的方法

    SpringCloud分布式鏈路跟蹤的方法

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

    深入剖析java中的集合框架

    下面小編就為大家?guī)?lái)一篇深入剖析java中的集合框架。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-05-05
  • spring boot + mybatis如何實(shí)現(xiàn)數(shù)據(jù)庫(kù)的讀寫(xiě)分離

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

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

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

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

    Java輸出鏈表倒數(shù)第k個(gè)節(jié)點(diǎn)

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

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

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

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

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

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

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

最新評(píng)論