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

Java鎖競(jìng)爭(zhēng)導(dǎo)致sql慢日志原因分析

 更新時(shí)間:2022年11月20日 15:40:18   作者:古柏樹(shù)下  
這篇文章主要介紹了Java鎖競(jìng)爭(zhēng)導(dǎo)致sql慢的日志原因分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧

線(xiàn)上在同步用戶(hù)時(shí),經(jīng)常出現(xiàn)簡(jiǎn)單sql的慢日志。根據(jù)方法找到代碼,發(fā)現(xiàn)方法內(nèi)使用redisson進(jìn)行鎖操作,waiTime和leaseTime都為3秒,數(shù)據(jù)庫(kù)操作比較簡(jiǎn)單,只是一個(gè)簡(jiǎn)單的用戶(hù)更新操作。代碼簡(jiǎn)化后如下

@Override
@Transactional(rollbackFor = Exception.class)
public LiveMemberResponseDTO becomeStudentNotQueryOrder(LiveBecomeStudentForOrderRequestDTO requestDTO) {
    EduUserEntity user = eduUserService.syncLocalByAccount(requestDTO.getOrderAccountId(), UserRegisterChannel.LIVE_APPLY);
    EduUserEntity applyUser = eduUserService.syncLocalByAccount(requestDTO.getApplyAccountId(), UserRegisterChannel.LIVE_APPLY);
    ...
    ...
    ...
}

調(diào)用了更新方法

@Override
@Lock(waitTime = 10000, leaseTime = 3000, value = RedisConstant.USER_SYNC_LOCAL, key = "#accountId")
public EduUserEntity syncLocalByAccount(String accountId, String mobile, String fullName, String source, UserRegisterChannel registerChannel) {
    EduUserEntity eduUserEntity = queryUsersByAccountId(accountId);
    boolean updateFlag = false;
    ....
	....
	....//判斷是否需要更新
    if (updateFlag) {
       saveOrUpdate(eduUserEntity);
    }
    return eduUserEntity;
}

由于這里事務(wù)里面嵌套了redis鎖,并且涉及到更新表,可能會(huì)有死鎖的情況。通過(guò)在獲取鎖的地方打上地址獲取到以下日志

可以看到[Thread-13]在等待了三秒后才獲取到redis,根據(jù)獲取鎖的時(shí)機(jī),列出表格

事務(wù)A(Thread-13)事務(wù)B(Thread-14)
獲取redis鎖
獲取db鎖
釋放redis鎖
獲取redis鎖
嘗試獲取db鎖
嘗試獲取redis鎖
等待三秒
redis鎖超時(shí),釋放redis鎖
成功獲取redis鎖
完成業(yè)務(wù)
釋放redis和db鎖
獲取db鎖

這是由于兩次更新user表過(guò)程中,使用了一個(gè)事務(wù)A,導(dǎo)致事務(wù)B來(lái)獲取db行鎖的時(shí)候,被事務(wù)A阻塞。但在被事務(wù)A阻塞前,已經(jīng)獲取到了redis鎖,所以導(dǎo)致事務(wù)A在獲取第二次更新的redis鎖的時(shí)候被阻塞,造成了死鎖。

最終導(dǎo)致,redis鎖超時(shí),日志方面體現(xiàn)為慢sql,因?yàn)槭聞?wù)B的sql等待了三秒才拿到鎖。

這種情況是因?yàn)槭聞?wù)和redis鎖的嵌套導(dǎo)致,所以指定更新方法的事務(wù)傳播等級(jí)為PROPAGATION_REQUIRED_NEW,不管外層是否存著事務(wù),都開(kāi)啟新事務(wù)。

修改后代碼

@Override
@Lock(waitTime = 10000, leaseTime = 3000, value = RedisConstant.USER_SYNC_LOCAL, key = "#accountId")
//這里開(kāi)啟新事務(wù)
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
public EduUserEntity syncLocalByAccount(String accountId, String mobile, String fullName, String source, UserRegisterChannel registerChannel) {
    EduUserEntity eduUserEntity = queryUsersByAccountId(accountId);
    boolean updateFlag = false;
    ....
	....
	....//判斷是否需要更新
    if (updateFlag) {
       saveOrUpdate(eduUserEntity);
    }
    return eduUserEntity;
}

聲明式事務(wù)使用很簡(jiǎn)單,可以自動(dòng)幫我們進(jìn)行事務(wù)的開(kāi)啟、提交以及回滾等操作,但是事務(wù)的顆粒度是整個(gè)方法,無(wú)法進(jìn)行精細(xì)化控制。在使用過(guò)程中要注意事務(wù)的范圍與其他中間件的交互,通過(guò)指定適當(dāng)?shù)膫鞑サ燃?jí)來(lái)達(dá)到效果。

到此這篇關(guān)于Java鎖競(jìng)爭(zhēng)導(dǎo)致sql慢日志原因分析的文章就介紹到這了,更多相關(guān)Java sql慢日志內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java使用正則表達(dá)式匹配獲取鏈接地址的方法示例

    Java使用正則表達(dá)式匹配獲取鏈接地址的方法示例

    這篇文章主要介紹了Java使用正則表達(dá)式匹配獲取鏈接地址的方法,簡(jiǎn)單分析了java正則匹配常用方法及獲取網(wǎng)址鏈接的相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • Java入門(mén)之集合框架詳解

    Java入門(mén)之集合框架詳解

    本文介紹了Java集合框架體系結(jié)構(gòu),包括List、Set和Map接口及其常用實(shí)現(xiàn)類(lèi),重點(diǎn)講解了ArrayList、LinkedList、HashSet、TreeSet和HashMap等類(lèi)的使用方法,并詳細(xì)介紹了泛型的定義和作用,最后,還討論了集合的遍歷和并發(fā)修改異常處理
    2025-01-01
  • Java基礎(chǔ)之Spring5的核心之一IOC容器

    Java基礎(chǔ)之Spring5的核心之一IOC容器

    這篇文章主要介紹了Java基礎(chǔ)之Spring5的核心之一IOC容器,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • java中的構(gòu)造函數(shù)什么時(shí)候被調(diào)用執(zhí)行

    java中的構(gòu)造函數(shù)什么時(shí)候被調(diào)用執(zhí)行

    這篇文章主要介紹了java中的構(gòu)造函數(shù)什么時(shí)候被調(diào)用執(zhí)行問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Spring Cloud Config實(shí)現(xiàn)分布式配置中心

    Spring Cloud Config實(shí)現(xiàn)分布式配置中心

    這篇文章主要介紹了Spring Cloud Config實(shí)現(xiàn)分布式配置中心,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Java解析zip文件,并識(shí)別壓縮包里面的文件轉(zhuǎn)換成可操作的IO流方式

    Java解析zip文件,并識(shí)別壓縮包里面的文件轉(zhuǎn)換成可操作的IO流方式

    這篇文章主要介紹了Java解析zip文件,并識(shí)別壓縮包里面的文件轉(zhuǎn)換成可操作的IO流方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java反射機(jī)制原理、Class獲取方式以及應(yīng)用場(chǎng)景詳解

    Java反射機(jī)制原理、Class獲取方式以及應(yīng)用場(chǎng)景詳解

    反射機(jī)制是JAVA的核心知識(shí)點(diǎn)之一,大多數(shù)框架的實(shí)現(xiàn)原理就是利用了反射機(jī)制,掌握反射機(jī)制會(huì)使你學(xué)習(xí)框架更加輕松高效,這篇文章主要給大家介紹了關(guān)于Java反射機(jī)制原理、Class獲取方式以及應(yīng)用場(chǎng)景的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • SpringBoot自定義Starter實(shí)現(xiàn)流程詳解

    SpringBoot自定義Starter實(shí)現(xiàn)流程詳解

    SpringBoot中的starter是一種非常重要的機(jī)制,能夠拋棄以前繁雜的配置,將其統(tǒng)一集成進(jìn)starter,應(yīng)用者只需要在maven中引入starter依賴(lài),SpringBoot就能自動(dòng)掃描到要加載的信息并啟動(dòng)相應(yīng)的默認(rèn)配置。starter讓我們擺脫了各種依賴(lài)庫(kù)的處理,需要配置各種信息的困擾
    2022-09-09
  • Java RSA加密解密實(shí)現(xiàn)方法分析【附BASE64 jar包下載】

    Java RSA加密解密實(shí)現(xiàn)方法分析【附BASE64 jar包下載】

    這篇文章主要介紹了Java RSA加密解密實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了java基于第三方類(lèi)庫(kù)javabase64-1.3.1.jar實(shí)現(xiàn)RSA加密解密功能的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2017-10-10
  • 手把手教你SpringBoot快速集成Swagger的配置過(guò)程

    手把手教你SpringBoot快速集成Swagger的配置過(guò)程

    這篇文章主要介紹了手把手教你SpringBoot快速集成Swagger的配置過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02

最新評(píng)論

丹凤县| 龙泉市| 灵台县| 象州县| 米泉市| 华安县| 延庆县| 微山县| 桦川县| 永顺县| 英吉沙县| 双峰县| 伊金霍洛旗| 南平市| 焉耆| 志丹县| 龙游县| 嵊州市| 临猗县| SHOW| 勐海县| 平远县| 江都市| 东乡县| 台前县| 河北区| 得荣县| 宁化县| 哈密市| 韶山市| 晋江市| 昂仁县| 汉寿县| 普洱| 安化县| 文安县| 洪江市| 麦盖提县| 紫金县| 佛学| 南丰县|