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

springboot使用mybatis開(kāi)啟事務(wù)回滾

 更新時(shí)間:2023年02月05日 11:04:29   作者:岑惜  
本文主要介紹了springboot使用mybatis開(kāi)啟事務(wù)回滾,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1.前言  

以前沒(méi)有使用mybatis,可以關(guān)閉自動(dòng)提交,然后做sql操作,對(duì)操作進(jìn)行catch捕獲異常,

如果沒(méi)有異常則commit 提交 ,有異常則 rollback 回滾,新增的數(shù)據(jù)則刪除 ,修改的數(shù)據(jù)則修改回去,刪除的則新增,

這就是事務(wù)操作。

事務(wù)有四大特性

(1)原子性:要么全部執(zhí)行成功,要么不執(zhí)行。

(2)一致性:事務(wù)執(zhí)行的結(jié)果,必須使數(shù)據(jù)庫(kù)從一個(gè)一致性狀態(tài)變到另一個(gè)一致性狀態(tài)。

(3)隔離性:并發(fā)操作同一個(gè)表時(shí)數(shù)據(jù)庫(kù)會(huì)開(kāi)啟多個(gè)事務(wù),多個(gè)事務(wù)之間相互隔離。

(4)持久性:當(dāng)事務(wù)確認(rèn)完成后,對(duì)數(shù)據(jù)的改變是永久性的。

那么mybatis怎么具體開(kāi)啟事務(wù)?

spring boot 開(kāi)啟其實(shí)很簡(jiǎn)單,使用注解開(kāi)啟即可,但是需要注意,需要觸發(fā)非檢查異常才會(huì)做事務(wù)回滾操作,【Exception 是檢查異?!?/p>

但是如果使用try catch 捕獲異常,也不會(huì)觸發(fā)異常,因?yàn)楫惓1?吃下去了,做了服務(wù)降級(jí)操作,事務(wù)以為沒(méi)有異常發(fā)生,因此不會(huì)觸發(fā)回滾操作。

如果非要觸發(fā)事務(wù)回滾,則需要在事務(wù)注解指定會(huì)觸發(fā)事務(wù)回滾操作的異常類型,如果需要自定義拋出異常后反饋前端的數(shù)據(jù),那么需要自定義異常,

自定義異常將會(huì)在下一隨筆詳細(xì)講解。

經(jīng)過(guò)測(cè)試總結(jié):

(1)父級(jí)方法開(kāi)啟事務(wù) @Transactional,父級(jí)發(fā)生異常,不僅父級(jí)會(huì)回滾,他調(diào)用的所有子方法都會(huì)回滾,也就是說(shuō),回滾事務(wù)父級(jí)可以影響所有子級(jí).

(2)如果子級(jí)開(kāi)了事務(wù),父級(jí)沒(méi)有開(kāi),發(fā)生異常,則僅僅讓子級(jí)方法回滾,如果父級(jí)也開(kāi)了事務(wù),那么所有的子級(jí)將會(huì)和父級(jí)一起回滾。

2.操作

(1)提前配置好spring boot + mybatis

目錄結(jié)構(gòu)

紅色箭頭的文件是必要的,

(2)導(dǎo)入依賴包

完整源碼

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>cen.cloud</groupId>
        <artifactId>cen-mycloud</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>rabbitmq-producer-1004</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>rabbitmq-producer-1004</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>


        <!--eureka 注冊(cè)中心依賴包 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

        <!-- 消息中間件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
            <version>2.1.6.RELEASE</version>
        </dependency>

        <!-- MySQL 依賴-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <!--            <scope>runtime</scope>-->
            <version>5.1.30</version>
        </dependency>
        <!--MySQL 數(shù)據(jù)源 依賴包-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>

        <!--        mybatis依賴-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.2</version>
        </dependency>
        <!-- mybatis的逆向工程依賴包-->
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.2</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

(3)啟動(dòng)類開(kāi)啟事務(wù)管理

(4)此時(shí)的數(shù)據(jù)庫(kù)表信息

3.測(cè)試

(1)父級(jí)方法不開(kāi)啟事務(wù),子級(jí)開(kāi)啟,讓子級(jí)方法觸發(fā)異常

啟動(dòng)后訪問(wèn)http://localhost:1004/sw

返回了500錯(cuò)誤

報(bào)了個(gè)異常

查看數(shù)據(jù)庫(kù)表信息

可見(jiàn)父級(jí)方法并沒(méi)有回滾,子級(jí)方法事務(wù)回滾了

(2)恢復(fù)數(shù)據(jù)庫(kù)表信息

父級(jí)方法不開(kāi)啟事務(wù),子級(jí)開(kāi)啟,讓子級(jí)方法catch捕獲觸發(fā)異常

父級(jí)方法不變,修改子級(jí)方法

啟動(dòng)后訪問(wèn)http://localhost:1004/sw

控制臺(tái)打印

查看數(shù)據(jù)庫(kù)

兩次sql操作都執(zhí)行了,子方法觸發(fā)了異常,并沒(méi)有做事務(wù)回滾操作,因?yàn)閏atch將服務(wù)降級(jí)了

那怎么辦?

希望既可以做事務(wù)回滾操作,又能讓前端獲取指定的反饋信息怎么操作?

答案是手動(dòng)拋出異常

throw new RuntimerException("這里寫上你需要的騷話");

(3)恢復(fù)數(shù)據(jù)庫(kù)表信息

父級(jí)方法不開(kāi)啟事務(wù),子級(jí)開(kāi)啟,讓子級(jí)方法catch捕獲觸發(fā)異常后,手動(dòng)拋出異常

父級(jí)方法不變,修改子級(jí)方法

啟動(dòng)后訪問(wèn)http://localhost:1004/sw

控制臺(tái)打印

查看數(shù)據(jù)庫(kù)

可見(jiàn),子級(jí)方法事務(wù)回滾了,但是父級(jí)沒(méi)有,因?yàn)楦讣?jí)沒(méi)有開(kāi)啟事務(wù)。

(4)如果使用 throw new Exception() 拋出異常則無(wú)法觸發(fā)事務(wù)回滾

恢復(fù)數(shù)據(jù)庫(kù)后,啟動(dòng)工程,訪問(wèn)http://localhost:1004/sw

查看數(shù)據(jù)庫(kù)

可見(jiàn),不能使用throw new Exception()

(5)恢復(fù)數(shù)據(jù)庫(kù)

在事務(wù)注解指定拋出的異常則可以讓檢查性異常觸發(fā)事務(wù)

父級(jí)方法不變,修改子級(jí)方法

啟動(dòng)工程,訪問(wèn)http://localhost:1004/sw

查看數(shù)據(jù)庫(kù)

顯然 ,子級(jí)方法做了事務(wù)回滾操作了,父級(jí)沒(méi)影響

(6)好了這里開(kāi)始需要修改父級(jí)啦,

在父級(jí)添加事務(wù)注解

子級(jí)方法不變

啟動(dòng)工程,訪問(wèn)http://localhost:1004/sw

查看數(shù)據(jù)庫(kù)

顯然,子級(jí)拋出異常,做了事務(wù)回滾操作,父級(jí)也做了事務(wù)回滾操作

(7)恢復(fù)數(shù)據(jù)庫(kù),刪除子級(jí)方法事務(wù)注解,即關(guān)閉子級(jí)事務(wù),父即開(kāi)啟事務(wù)

啟動(dòng)工程,訪問(wèn)http://localhost:1004/sw

查看數(shù)據(jù)庫(kù)

顯然,子級(jí)拋出異常,做了事務(wù)回滾操作,父級(jí)也做了事務(wù)回滾操作,即便子級(jí)沒(méi)有開(kāi)啟事務(wù),只有父級(jí)開(kāi)啟,

因此可見(jiàn),只要父級(jí)開(kāi)啟了事務(wù),不論是子級(jí)還是父級(jí)觸發(fā)了非檢查異常都會(huì)做事務(wù)回滾,如果是檢查異常,則需要在事務(wù)注解指定異常類型。

(8)如果子級(jí)方法不觸發(fā)異常,而是在父級(jí)觸發(fā),那么子級(jí)方法是否會(huì)回滾?

答案是會(huì)的

修改父級(jí)方法

修改子級(jí)方法

啟動(dòng)工程,訪問(wèn)http://localhost:1004/sw

查看數(shù)據(jù)庫(kù)

顯然,父級(jí)開(kāi)啟了事務(wù)且拋出異常,做了回滾操作,子級(jí)沒(méi)有開(kāi)啟事務(wù)也沒(méi)有拋出異常,仍然做了事務(wù)回滾操作

到此這篇關(guān)于springboot使用mybatis開(kāi)啟事務(wù)回滾的文章就介紹到這了,更多相關(guān)springboot mybatis 事務(wù)回滾內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Java使用Jsch與sftp服務(wù)器實(shí)現(xiàn)ssh免密登錄

    詳解Java使用Jsch與sftp服務(wù)器實(shí)現(xiàn)ssh免密登錄

    這篇文章主要介紹了詳解Java使用Jsch與sftp服務(wù)器實(shí)現(xiàn)ssh免密登錄,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Mybatis如何實(shí)現(xiàn)延遲加載及緩存

    Mybatis如何實(shí)現(xiàn)延遲加載及緩存

    這篇文章主要介紹了Mybatis如何實(shí)現(xiàn)延遲加載及緩存,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • SpringBoot集成Auth0 JWT的示例代碼

    SpringBoot集成Auth0 JWT的示例代碼

    本文主要介紹了SpringBoot集成Auth0 JWT的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • java讀取xml配置參數(shù)代碼實(shí)例

    java讀取xml配置參數(shù)代碼實(shí)例

    這篇文章主要介紹了java讀取xml配置參數(shù)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Spring Boot Admin監(jiān)控服務(wù)如何使用

    Spring Boot Admin監(jiān)控服務(wù)如何使用

    這篇文章主要介紹了Spring Boot Admin監(jiān)控服務(wù)如何使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 手把手教你如何在Idea中下載jar包

    手把手教你如何在Idea中下載jar包

    maven依賴的jar包,很多時(shí)候同一個(gè)jar包會(huì)存在多個(gè)版本,刪除其中一個(gè)后,重新編譯,會(huì)把舊jar由加載回來(lái)了,下面這篇文章主要給大家介紹了關(guān)于如何在Idea中下載jar包的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • 淺析Java8 中 Map 接口的新方法

    淺析Java8 中 Map 接口的新方法

    這篇文章主要介紹了Java8 中 Map 接口的新方法,本文通過(guò)代碼實(shí)例給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Java中jdk1.8和jdk17相互切換實(shí)戰(zhàn)步驟

    Java中jdk1.8和jdk17相互切換實(shí)戰(zhàn)步驟

    之前做Java項(xiàng)目時(shí)一直用的是jdk1.8,現(xiàn)在想下載另一個(gè)jdk版本17,并且在之后的使用中可以進(jìn)行相互切換,下面這篇文章主要給大家介紹了關(guān)于Java中jdk1.8和jdk17相互切換的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • Java SpringMVC攔截器與異常處理機(jī)制詳解分析

    Java SpringMVC攔截器與異常處理機(jī)制詳解分析

    SpringMVC是一種基于Java,實(shí)現(xiàn)了Web MVC設(shè)計(jì)模式,請(qǐng)求驅(qū)動(dòng)類型的輕量級(jí)Web框架,即使用了MVC架構(gòu)模式的思想,將Web層進(jìn)行職責(zé)解耦?;谡?qǐng)求驅(qū)動(dòng)指的就是使用請(qǐng)求-響應(yīng)模型,框架的目的就是幫助我們簡(jiǎn)化開(kāi)發(fā),SpringMVC也是要簡(jiǎn)化我們?nèi)粘eb開(kāi)發(fā)
    2021-10-10
  • 為什么不要使用 async void的原因分析

    為什么不要使用 async void的原因分析

    這篇文章主要介紹了為什么不要使用 async void的原因分析及解決方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04

最新評(píng)論