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

SpringBoot中@Transiactional注解沒(méi)有效果的解決

 更新時(shí)間:2021年08月19日 14:38:39   作者:醉耕  
這篇文章主要介紹了SpringBoot中@Transiactional注解沒(méi)有效果的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

SpringBoot @Transiactional注解沒(méi)有效果

背景

數(shù)據(jù)庫(kù)為mysql

問(wèn)題

使用SpringBoot操作數(shù)據(jù)庫(kù)插入兩條數(shù)據(jù),service層的方法出現(xiàn)了異常,按理說(shuō)兩條數(shù)據(jù)都該插不進(jìn)去的,可以數(shù)據(jù)庫(kù)中卻還是有一條數(shù)據(jù)。

數(shù)據(jù)庫(kù)表格式:

這里寫圖片描述

service層代碼:

package com.example.demo.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.example.demo.domain.Girl;
import com.example.demo.repository.GirlRepository;
@Service
public class GirlService {
    @Autowired
    private GirlRepository girlRepository;
    @Transactional
    public void transiactionTest() {
        Girl g1 = new Girl();
        g1.setAge(33);
        g1.setCupSize("B");
        girlRepository.save(g1);
        Girl g2 = new Girl();
        g2.setAge(33);
        g2.setCupSize("FFFFF");  // 長(zhǎng)度和數(shù)據(jù)庫(kù)的長(zhǎng)度不符,會(huì)出異常
        girlRepository.save(g2);
    }
}

啟動(dòng)SpringBoot后,訪問(wèn)對(duì)應(yīng)的方法,控制臺(tái)也報(bào)錯(cuò),但是表中是有一條數(shù)據(jù)的(原本是空表)。

這里寫圖片描述

查了查資料說(shuō)的是在設(shè)計(jì)表的時(shí)候要選取的InnoDB引擎。

回頭看我的表引擎:

還真的是。。。。。。

解決

將數(shù)據(jù)表的引擎設(shè)置為InnoDB引擎。 然后再次執(zhí)行,@Transitional注解才起了作用,數(shù)據(jù)表中沒(méi)有了數(shù)據(jù)。

這里寫圖片描述

SpringBoot 使用Transaction注解遇到的坑

一、場(chǎng)景

開(kāi)發(fā)一個(gè)多批次入庫(kù)的功能,功能中涉及到多個(gè)表間的操作,對(duì)數(shù)據(jù)庫(kù)表的操作要么同時(shí)成功,要么同時(shí)失敗,不然就會(huì)存在臟數(shù)據(jù),所以使用到了事務(wù)這個(gè)知識(shí)點(diǎn)()。

劃重點(diǎn):重要的都使用紅色標(biāo)出來(lái)了,大家如果不想看我廢話,直接跳到紅色字體即可0...0

二、Spring中使用的使用方式

1、使用傳統(tǒng)的手動(dòng)開(kāi)始,手動(dòng)提交事務(wù)即:beginTransaction()、commit()、rollback()等事務(wù)管理相關(guān)的方法,這就是編程式事務(wù)管理。

2、使用Transaction注解的聲明式事務(wù),將事務(wù)的開(kāi)啟和提交交給Spring容器完成,這個(gè)也是本次我使用的方式,簡(jiǎn)單,但是使用時(shí)需要注意很多細(xì)節(jié)。

3、基于Spring AOP的切面的事務(wù)配置(本人很少使用這個(gè),所以本文不重點(diǎn)刨析該知識(shí)點(diǎn),想了解的可以到其他博客進(jìn)行查看)

三、使用中遇到的問(wèn)題

1、使用Transaction注解時(shí)拋出異常但是事務(wù)不起作用,異常時(shí)事務(wù)沒(méi)有進(jìn)行回滾?

答:經(jīng)過(guò)排查,查詢?cè)陂_(kāi)啟事務(wù)的方法中最外層使用了try...catch進(jìn)行了異常的捕獲,因此拋出的異常本捕獲了,切面無(wú)法捕獲到異常,所以不會(huì)進(jìn)行回滾。

解決:

(1) 手動(dòng)指定切面捕獲的異常類型(因?yàn)槟J(rèn)情況下只會(huì)在RuntimeExceptionimeException情況下才會(huì)進(jìn)行事務(wù)的回滾),方式:@Transaction(rollbcackFor=Exception.class)

(2) 在catch中手動(dòng)拋出一個(gè)運(yùn)行時(shí)異常即:throw new RuntimeException();

(3) 如果需要在事務(wù)回滾時(shí),給調(diào)用當(dāng)前方法的調(diào)用者返回錯(cuò)誤信息的話,用第二種方案就是不行的,因?yàn)閽伋霎惓:蟮恼Z(yǔ)句時(shí)不會(huì)執(zhí)行的,包括return后面的語(yǔ)句,所以,此時(shí)可以手動(dòng)進(jìn)行事務(wù)回滾的語(yǔ)句調(diào)用即:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

2、剛插入的數(shù)據(jù),無(wú)法馬上查詢到?

答: 這個(gè)問(wèn)題是個(gè)大坑,整整苦惱了我兩天(可能是之前使用事務(wù)相關(guān)的知識(shí)比較少,所以遇到了根本就不知道是什么原因),因?yàn)轫?xiàng)目中使用的是MybatisPlus框架,一開(kāi)始便懷疑是框架的緩存問(wèn)題,因?yàn)閯偛迦腭R上查詢時(shí),查詢的SQL語(yǔ)句并沒(méi)有執(zhí)行,即根本沒(méi)到數(shù)據(jù)庫(kù)去查,但是,手動(dòng)關(guān)閉了緩存之后并沒(méi)起效果,最后大佬看了代碼后,一眼就指出問(wèn)題所在(現(xiàn)在不得不感慨,經(jīng)驗(yàn)時(shí)多么重要)。

要解決這個(gè)問(wèn)題,首先要知道使用Transaction是怎么進(jìn)行事務(wù)增強(qiáng)的,說(shuō)白了,是通過(guò)生成代理對(duì)象進(jìn)行切面注入的,當(dāng)前對(duì)象并沒(méi)有增強(qiáng)的作用,剛開(kāi)始我插入和查詢的方法都是寫在一個(gè)service中,然后使用this調(diào)用這些方法,而this表示的是當(dāng)前的service對(duì)象,所以這些方法根本就不在當(dāng)前的事務(wù)中,因?yàn)閯偛迦氲臄?shù)據(jù)無(wú)法馬上查詢到0....0(我踩的大坑希望大家不要再踩了,太難受了..)

解決方法:說(shuō)了這么多廢話,現(xiàn)在知道問(wèn)題產(chǎn)生的原因,所以就好解決了:

(1) 將所有的數(shù)據(jù)庫(kù)操作方法抽取到另外一個(gè)Service對(duì)象中,然后通過(guò)@Autowire注入調(diào)用即可。

(2) 自己注入自己的對(duì)象即當(dāng)前Service為A,可以直接使用:@Autowire private A a; 然后通過(guò)a調(diào)用相關(guān)數(shù)據(jù)庫(kù)操作的方法(注意不要使用this,使用this的話無(wú)效),@Autowire private A a這句話實(shí)際上返回的是當(dāng)前Service的代理對(duì)象,但特別需要注意的是:所有操作數(shù)據(jù)庫(kù)相關(guān)的方法,訪問(wèn)權(quán)限都需改成public,不然會(huì)出現(xiàn)mapper和service注入為null---這個(gè)是個(gè)大坑,具體原因還不知道(這個(gè)方式推薦使用)

(3) 使用:((A) AopContext.currentProxy()).方法名()進(jìn)行調(diào)用(聽(tīng)說(shuō)這個(gè)方式在打包發(fā)布的時(shí)候會(huì)出現(xiàn)問(wèn)題,本次沒(méi)有試過(guò)這個(gè)方式,所以不推薦)

總結(jié):

經(jīng)驗(yàn)就是一個(gè)積累的過(guò)程,沒(méi)有誰(shuí)能夠一步登天,所以腳踏實(shí)地才是成功的秘訣。本文只是本人在使用事務(wù)知識(shí)是遇到的問(wèn)題的總結(jié),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家!

相關(guān)文章

  • Java 調(diào)整格式日志輸出

    Java 調(diào)整格式日志輸出

    本文主要介紹Java 的日志輸出格式,在開(kāi)發(fā)java的時(shí)候會(huì)經(jīng)常看日志進(jìn)行調(diào)試或者查看錯(cuò)誤,這里給大家介紹日志輸出調(diào)整格式,以便大家看日志的時(shí)候更加方便,
    2016-07-07
  • springboot的http.server.requests服務(wù)請(qǐng)求流程源碼

    springboot的http.server.requests服務(wù)請(qǐng)求流程源碼

    這篇文章主要為大家介紹了springboot的http.server.requests服務(wù)請(qǐng)求流程源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Java設(shè)計(jì)模式之原型設(shè)計(jì)示例詳解

    Java設(shè)計(jì)模式之原型設(shè)計(jì)示例詳解

    這篇文章主要為大家詳細(xì)介紹了Java的原型設(shè)計(jì)模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • 詳解Spring中bean生命周期回調(diào)方法

    詳解Spring中bean生命周期回調(diào)方法

    本篇文章主要介紹了詳解Spring中bean生命周期回調(diào)方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • Go并發(fā)編程中使用channel的方法

    Go并發(fā)編程中使用channel的方法

    本文給大家介紹Go并發(fā)編程中使用channel的方法,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-11-11
  • 解決JavaEE開(kāi)發(fā)中字符編碼出現(xiàn)亂碼的問(wèn)題

    解決JavaEE開(kāi)發(fā)中字符編碼出現(xiàn)亂碼的問(wèn)題

    下面小編就為大家?guī)?lái)一篇解決JavaEE開(kāi)發(fā)中字符編碼出現(xiàn)亂碼的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • RocketMQ的消費(fèi)者類型與最佳實(shí)踐詳解

    RocketMQ的消費(fèi)者類型與最佳實(shí)踐詳解

    這篇文章主要介紹了RocketMQ的消費(fèi)者類型與最佳實(shí)踐詳解,在?RocketMQ?5.0?中,更加強(qiáng)調(diào)了客戶端類型的概念,尤其是消費(fèi)者類型,為了滿足多樣的?RocketMQ?中一共有三種不同的消費(fèi)者類型,分別是?PushConsumer、SimpleConsumer?和?PullConsumer,需要的朋友可以參考下
    2023-10-10
  • Java 基于雪花算法生成分布式id

    Java 基于雪花算法生成分布式id

    SnowFlake 算法(雪花算法), 是Twitter開(kāi)源的分布式id生成算法。其核心思想就是: 使用一個(gè)64 bit的long型的數(shù)字作為全局唯一id。本文講述Java 基于雪花算法生成分布式id的方法
    2021-06-06
  • springboot整合JSR303參數(shù)校驗(yàn)與全局異常處理的方法

    springboot整合JSR303參數(shù)校驗(yàn)與全局異常處理的方法

    JSR-303 是 JAVA EE 6 中的一項(xiàng)子規(guī)范,叫做 Bean Validation,官方參考實(shí)現(xiàn)是Hibernate Validator,這篇文章主要介紹了springboot整合JSR303參數(shù)校驗(yàn)與全局異常處理,需要的朋友可以參考下
    2022-09-09
  • SpringBoot+Shiro學(xué)習(xí)之密碼加密和登錄失敗次數(shù)限制示例

    SpringBoot+Shiro學(xué)習(xí)之密碼加密和登錄失敗次數(shù)限制示例

    本篇文章主要介紹了SpringBoot+Shiro學(xué)習(xí)之密碼加密和登錄失敗次數(shù)限制示例,可以限制登陸次數(shù),有興趣的同學(xué)可以了解一下。
    2017-03-03

最新評(píng)論

民乐县| 育儿| 南城县| 托克托县| 唐山市| 工布江达县| 武汉市| 奉化市| 岗巴县| 正镶白旗| 龙门县| 文安县| 康乐县| 崇文区| 泗阳县| 上思县| 道孚县| 凯里市| 同仁县| 景谷| 榆树市| 武强县| 张家港市| 普陀区| 苏尼特右旗| 平度市| 岳西县| 天镇县| 高雄县| 靖西县| 邹城市| 延吉市| 株洲市| 黄山市| 桃江县| 滦平县| 和平区| 东宁县| 香港| 和平县| 陆良县|