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

SpringBoot中的事務(wù)配置管理詳解

 更新時(shí)間:2024年01月15日 10:13:16   作者:Mu_Mu是一只小白  
這篇文章主要介紹了SpringBoot中的事務(wù)配置管理詳解,Spring Boot 默認(rèn)的事務(wù)規(guī)則是遇到運(yùn)行異常(RuntimeException)和程序錯(cuò)誤(Error)才會(huì)回滾,但是拋出SQLException就無法回滾了,需要的朋友可以參考下

Spring Boot事務(wù)配置管理

場景:我們?cè)陂_發(fā)企業(yè)應(yīng)用時(shí),由于數(shù)據(jù)操作在順序執(zhí)行的過程中,線上可能有各種無法預(yù)知的問題,

任何一步操作都有可能發(fā)生異常,異常則會(huì)導(dǎo)致后續(xù)的操作無法完成。此時(shí)由于業(yè)務(wù)邏輯并未正確的完

成,所以在之前操作過數(shù)據(jù)庫的動(dòng)作并不可靠,需要在這種情況下進(jìn)行數(shù)據(jù)的回滾。

1. 導(dǎo)入依賴

springboot的事務(wù)管理需要導(dǎo)入spring-boot-starter-jdbc;而我們導(dǎo)入的mybatis-spring-boot-starter包含了它,所以無需重復(fù)導(dǎo)入;

 <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.1</version>
        </dependency>

2. 事務(wù)測試

1)mapper接口

@Insert("insert into tb_filminfo (typeid,filmname,ticketprice) values(#{typeid},#{filmname},#{ticketprice})")
    int insert(FilminfoPO po);

2)service接口

public interface IFilmInfoService {
    //插入一條記錄
    public int insert(FilminfoPO po);

3)service實(shí)現(xiàn)類

@Service
public class FilmInfoServiceImpl implements IFilmInfoService {
   @Resource
    private FilmInfoMapper mapper;

    @Transactional
    @Override
    public int insert(FilminfoPO po) {

        return mapper.insert(po);
    }

4)controller類

@Controller
@RequestMapping("/film")
public class FilmInfoController {

   @Resource
    IFilmInfoService service;

    @RequestMapping("/insert")
    public String insert(FilminfoPO po) {
       if (po!=null) {
            int i = service.insert(po);
            return "success";
        } else {
            return "false";
        }
    }
}

當(dāng)沒有異常拋出時(shí)添加成功,有異常出現(xiàn)添加失?。?/p>

3. 事務(wù)處理的一些特殊情況

1)異常并沒有被捕獲到

異常并沒有被 ”捕獲“ 到,導(dǎo)致事務(wù)并沒有回滾。

Spring Boot 默認(rèn)的事務(wù)規(guī)則是遇到運(yùn)行異常(RuntimeException)和程序 錯(cuò)誤(Error)才會(huì)回滾。但是拋出 SQLException 就無法回滾了。

   @Transactional
    @Override
    public void insert(FilminfoPO po) throws SQLException {
        // 手動(dòng)拋出異常
        mapper.insert(po);
        throw new SQLException("數(shù)據(jù)庫異常");

雖然拋出異常但是數(shù)據(jù)插入成功;

解決方案:針對(duì)非運(yùn)行時(shí)異常,如果要進(jìn)行事務(wù)回滾的話,可以在 @Transactional 注解中使用 rollbackFor 屬性來指定異常,比如 @Transactional(rollbackFor = Exception.class) ,這樣就沒有問題了,所以在實(shí)際項(xiàng)目中,一定要指定異常。

 @Transactional(rollbackFor = Exception.class)
    @Override
    public void insert(FilminfoPO po) throws SQLException {
        // 手動(dòng)拋出異常
        mapper.insert(po);
        throw new SQLException("數(shù)據(jù)庫異常");
    }

這樣就插入失敗了;

2)異常在方法中被捕獲導(dǎo)致事務(wù)回滾失敗

我們?cè)谔幚懋惓r(shí),有兩種方式, 要么拋出去,讓上一層來捕獲處理;要么把異常 try catch 掉,在異常出現(xiàn)的地方給處理掉。就因?yàn)橛?這中 try…catch,所以導(dǎo)致異常被 ”吃“ 掉,事務(wù)無法回滾。

    @Transactional
    @Override
    public int insert(FilminfoPO po) {
        try {
            int i = 1 / 0;
        } catch (Exception e) {
            e.getMessage();
        }
        return mapper.insert(po);
    }

記錄成功被插入;

解決方法:直接往上拋,給上一層來處理即可

3)事務(wù)的范圍 沖突導(dǎo)致回滾失敗

許多業(yè)務(wù)需要在高并發(fā)的情況下保證數(shù)據(jù)唯一性所比要加synchronized關(guān)鍵字如一個(gè)數(shù)據(jù)庫中,針對(duì)某個(gè)用戶,只有一條記錄,下一個(gè)插入動(dòng)作過來,會(huì)先判斷該數(shù)據(jù)庫 中有沒有相同的用戶,如果有就不插入,就更新,沒有才插入,所以理論上,數(shù)據(jù)庫中永遠(yuǎn)就一條同一 用戶信息,不會(huì)出現(xiàn)同一數(shù)據(jù)庫中插入了兩條相同用戶的信息。

    @Transactional(rollbackFor = Exception.class)
    @Override
    public synchronized void insert(FilminfoPO po) throws SQLException {
        // 手動(dòng)拋出異常
        mapper.insert(po);
     
    }

但是在壓測時(shí),數(shù)據(jù)庫中確實(shí)可能有兩條同一用戶的信息,分析其原因,在于事務(wù)的

范圍和鎖的范圍問題。

在執(zhí)行該方法開始時(shí),事務(wù)啟動(dòng),執(zhí)行 完了后,事務(wù)關(guān)閉。但是 synchronized 沒有起作用,其實(shí)根本原因是因?yàn)槭聞?wù)的范圍比鎖的范圍大。 也就是說,在加鎖的那部分代碼執(zhí)行完之后,鎖釋放掉了,但是事務(wù)還沒結(jié)束,此時(shí)另一個(gè)線程進(jìn)來 了,事務(wù)沒結(jié)束的話,第二個(gè)線程進(jìn)來時(shí),數(shù)據(jù)庫的狀態(tài)和第一個(gè)線程剛進(jìn)來是一樣的。即由于mysql Innodb引擎的默認(rèn)隔離級(jí)別是可重復(fù)讀(在同一個(gè)事務(wù)里,SELECT的結(jié)果是事務(wù)開始時(shí)時(shí)間點(diǎn)的狀 態(tài)),線程二事務(wù)開始的時(shí)候,線程一還沒提交完成,導(dǎo)致讀取的數(shù)據(jù)還沒更新。第二個(gè)線程也做了插 入動(dòng)作,導(dǎo)致了臟數(shù)據(jù)。

解決方案:

? 1.把事務(wù)去掉即可(不推薦);

? 2. 在調(diào)用該 service 的地方加鎖,保證鎖 的范圍比事務(wù)的范圍大即可。

到此這篇關(guān)于SpringBoot中的事務(wù)配置管理詳解的文章就介紹到這了,更多相關(guān)SpringBoot事務(wù)配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談讓@Value更方便的Spring自定義轉(zhuǎn)換類

    淺談讓@Value更方便的Spring自定義轉(zhuǎn)換類

    Spring為大家內(nèi)置了不少開箱即用的轉(zhuǎn)換類,如字符串轉(zhuǎn)數(shù)字、字符串轉(zhuǎn)時(shí)間等,但有時(shí)候需要使用自定義的屬性,則需要自定義轉(zhuǎn)換類了
    2021-06-06
  • Java Reflect如何利用反射獲取屬性上的注解

    Java Reflect如何利用反射獲取屬性上的注解

    AnnotatedElement接口是Java反射機(jī)制的一部分,用于讀取運(yùn)行中程序的注釋信息,通過getAnnotation、getAnnotations、isAnnotationPresent和getDeclaredAnnotations方法,可以訪問和判斷注解,Field類實(shí)現(xiàn)了該接口
    2024-09-09
  • Java重寫與重載之間的區(qū)別

    Java重寫與重載之間的區(qū)別

    本文主要介紹了Java重寫與重載之間的區(qū)別。具有一定的參考價(jià)值,下面跟著小編一起來看下吧
    2017-01-01
  • java 動(dòng)態(tài)代理的方法總結(jié)

    java 動(dòng)態(tài)代理的方法總結(jié)

    這篇文章主要介紹了java 動(dòng)態(tài)代理的方法總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Java實(shí)現(xiàn)把文件及文件夾壓縮成zip

    Java實(shí)現(xiàn)把文件及文件夾壓縮成zip

    這篇文章主要介紹了Java實(shí)現(xiàn)把文件及文件夾壓縮成zip,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • springboot設(shè)置tomcat post參數(shù)大小限制修改方式

    springboot設(shè)置tomcat post參數(shù)大小限制修改方式

    在SpringBoot項(xiàng)目中使用富文本框上傳大量圖片時(shí),會(huì)遇到請(qǐng)求體大小限制的問題,可以通過修改Tomcat配置文件或在application.properties中設(shè)置maxPostSize參數(shù)來解決這個(gè)問題,修改后需要重啟服務(wù)器,熱部署可能需要額外重啟才能生效
    2025-11-11
  • 去掉 IDEA 中 mybatis配置文件的局部背景顏色(圖解)

    去掉 IDEA 中 mybatis配置文件的局部背景顏色(圖解)

    這篇文章通過圖文并茂的形式給大家介紹了去掉IntelliJ IDEA 中 mybatis配置文件的局部背景顏色及mybatis 對(duì)應(yīng)的 xml 文件警告的方法圖解,需要的朋友可以參考下
    2018-09-09
  • Java PDF 添加數(shù)字簽名的實(shí)現(xiàn)方法

    Java PDF 添加數(shù)字簽名的實(shí)現(xiàn)方法

    這篇文章主要介紹了Java PDF 添加數(shù)字簽名的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • SpringBoot通過Filter實(shí)現(xiàn)整個(gè)項(xiàng)目接口的SQL注入攔截詳解

    SpringBoot通過Filter實(shí)現(xiàn)整個(gè)項(xiàng)目接口的SQL注入攔截詳解

    這篇文章主要介紹了SpringBoot通過Filter實(shí)現(xiàn)整個(gè)項(xiàng)目接口的SQL注入攔截詳解,SQL注入是比較常見的網(wǎng)絡(luò)攻擊方式之一,在客戶端在向服務(wù)器發(fā)送請(qǐng)求的時(shí)候,sql命令通過表單提交或者url字符串拼接傳遞到后臺(tái)持久層,最終達(dá)到欺騙服務(wù)器執(zhí)行惡意的SQL命令,需要的朋友可以參考下
    2023-12-12
  • SpringBoot異步使用@Async的原理以及線程池配置詳解

    SpringBoot異步使用@Async的原理以及線程池配置詳解

    在項(xiàng)目中當(dāng)訪問其他人的接口較慢時(shí),不想程序一直卡在耗時(shí)任務(wù)上,想程序能夠并行執(zhí)行,我們可以使用多線程來并行的處理任務(wù),也可以使用spring提供的異步處理方式@Async,這篇文章主要給大家介紹了關(guān)于SpringBoot異步使用@Async的原理以及線程池配置的相關(guān)資料
    2021-09-09

最新評(píng)論

赣榆县| 化隆| 花垣县| 花莲市| 新化县| 沙坪坝区| 日照市| 兴安县| 南城县| 渝北区| 论坛| 兴安县| 大田县| 手游| 桐柏县| 康马县| 柳河县| 大英县| 徐水县| 安康市| 卫辉市| 眉山市| 张家口市| 钦州市| 十堰市| 重庆市| 黄大仙区| 宝山区| 明溪县| 河西区| 定襄县| 兰州市| 南部县| 乐昌市| 巨野县| 丰城市| 昭平县| 郁南县| 佳木斯市| 九江市| 海淀区|