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

詳解Spring事務和事務傳播機制

 更新時間:2024年12月02日 08:37:54   作者:2的n次方_  
本文主要介紹了MySQL中的事務以及如何在Spring框架中實現事務管理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

1. 事務的回顧

在 MySQL 學習階段,已經了解到了事務是一組操作的集合,也就是把所有的操作作為一個整體,一起向數據庫提交或者撤銷操作,要么同時成功,要么同時失敗

一個事務的操作流程包括了,開啟事務,執(zhí)行事務操作,提交事務或回滾事務,對于回滾事務來說,如果程序在執(zhí)行過程中出現了錯誤,那么此時就需要執(zhí)行回滾事務

2. 事務的實現方式

2.1. 編程式事務

Spring 手動操作事務和 MySQL 操作事務類似,也是分為開啟事務,提交事務,回滾事務等三個操作,需要用到 DataSourceTransactionManager (事務管理器)來進行上述事務的操作,還需要用到 TransactionDefinition(事務的屬性,獲取事務時需要把這個類的對象傳進去)

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @Autowired
    private DataSourceTransactionManager dataSourceTransactionManager;

    @Autowired
    private TransactionDefinition transactionDefinition;

    @RequestMapping("/registy")
    public String registy(String name, String password) {
        //開啟事務,獲取一個狀態(tài),之后回滾就回滾到了這個狀態(tài)
        TransactionStatus transaction = dataSourceTransactionManager.getTransaction(transactionDefinition);
        Integer reuslt = userService.insert(name, password);
        //提交事務(提交的是之前獲取的狀態(tài))
        dataSourceTransactionManager.commit(transaction);
        return "注冊成功";
    }
}

測試之后數據也是正常更新了

回滾的話調用的是 rollback 方法,再次進行插入數據,數據就沒有更新,不過自增 id 還是變成了 3,對比提交事務的日志可以看出,這次沒有提交事務的信息了

2.2. 聲明式事務

上面的方式是比較麻煩的,需要自己寫一大堆信息,來看聲明式事務是如何操作的

首先需要添加依賴:

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-tx</artifactId>
</dependency>

只需在要執(zhí)行的方法上添加@Transactional注解,添加之后,如果沒有發(fā)生異常就正常執(zhí)行,如果發(fā)生了異常就回滾事務

來看異常的情況:

這時事務就沒有提交,進行了回滾

3. @Transactional

@Transactional 可以用來修飾方法或類,修飾方法時,只有修飾 public 方法時才生效,修飾其他方法時不會報錯,但也不生效,修飾類時,對該類中所有的 public 方法都生效

在目標方法執(zhí)行開始之前會自動開啟事務,執(zhí)行結束之后會自動提交事務,如果方法執(zhí)行過程中出現異常且異常未被捕獲,就進行事務回滾操作

例如,把上面的異常代碼 catch 起來,事務就正常提交了

但是如果捕獲之后又進行拋出,那么事務還是會回滾的

還可以通過調用 setRollbackOnly 方法進行手動回滾

這樣的話把異常捕獲之后還可以回滾事務

3.1. rollbackFor

@Transactional默認只在遇到 RuntimeException 和 Error 時才進行回滾,非運行時異常就不會滾,來演示一下發(fā)生非運行異常時的情況:

雖然此時拋出了異常,但是事務還是提交了,并沒有進行回滾,可以通過設置@Transactional注解的 rollbackFor 屬性來指定那些異常要回滾

把 rollbackFor 設置為 Exception.class,表示 Exception 底下的子類異常都會發(fā)生回滾

@Transactional(rollbackFor = Exception.class)
@RequestMapping("/r3")
public String r3(String name, String password) throws IOException {
    Integer reuslt = userService.insert(name, password);
    if (true) {
        throw new IOException();
    }
    return "注冊成功";
}

此時再次測試,事務就回滾了

3.2. isolation

@Transactional 注解的 isolation 屬性是可以設置事務的隔離級別的,參數類型是一個 Isolation 的枚舉類,依次表示當前數據庫默認使用的隔離級別和事務的四種隔離級別

可以根據需要進行設置

//設置事務的隔離級別
@Transactional(isolation = Isolation.DEFAULT)
@RequestMapping("/r4")
public String r4(String name, String password) throws IOException {
    Integer reuslt = userService.insert(name, password);
    if (true) {
        throw new IOException();
    }
    return "注冊成功";
}

4. 事務傳播機制

事務傳播機制是指在多個事務方法相互調用時,定義事務如何在這些方法之間傳播的規(guī)則,也就是延用調用方法的事務還是再重新開啟一個新事務

Spring 事務的傳播機制有以下七種

事務傳播機制

描述

理解(有 A,B 兩個方法,A 調用 B 對于 B 來說)

Propagation.REQUIRED

默認的事務傳播級別。如果當前存在事務,則加入該事務。如果當前沒有事務,則創(chuàng)建一個新的事務。

A 有事務就用 A 的,沒有 B 就再開啟新的

Propagation.SUPPORTS

如果當前存在事務,則加入該事務。如果當前沒有事務,則以非事務的方式繼續(xù)運行。

A 沒有事務就算了,B 就按照沒有事務的方式執(zhí)行

Propagation.MANDATORY

如果當前存在事務,則加入該事務。如果當前沒有事務,則拋出異常。

如果 A 沒有事務,就拋出異常

Propagation.REQUIRES_NEW

如果當前存在事務,則把當前事務掛起。也就是說不管外部方法是否開啟事務,Propagation.REQUIRES_NEW 修飾的內部方法都會新開啟自己的事務,且開啟的事務相互獨立,互不干擾。

不管 A 有沒有事務,B 都要開啟新事務

Propagation.NOT_SUPPORTED

以非事務方式運行,如果當前存在事務,則把當前事務掛起(不用)。

不管 A 有沒有事務,B 都以非事務方式執(zhí)行

Propagation.NEVER

以非事務方式運行,如果當前存在事務,則拋出異常。

B 以非事務方式執(zhí)行,如果 A 有事務就拋出異常

Propagation.NESTED

如果當前存在事務,則創(chuàng)建一個事務作為當前事務的嵌套事務來運行。如果當前沒有事務,則該取值等價于 PROPAGATION_REQUIRED。

如果 A 有事務,B 就創(chuàng)建一個嵌套事務,如果沒有就創(chuàng)建新的

4.1. REQUIRED

把 UserService 和 LogService 的兩個方法都設置為 REQUIRED

@Slf4j
@RestController
@RequestMapping("/propaga")
public class PropagationController {
    @Autowired
    private UserService userService;
    @Autowired
    private LogService logService;

    @Transactional
    @RequestMapping("/r1")
    public String registy(String name, String password) {
        userService.insert(name, password);
        logService.insertLog(name,"用戶注冊");
        return "注冊成功";
    }
}

在 PropagationController 中進行調用,此時 registy 就相當于 A ,調用的兩個方法相當于 B,運行之后,如果其中一個方法發(fā)生異常,那么 registy 方法的整個事務都會回滾,也就是他們都用的是 A 的事務

4.2. REQUIRES_NEW

把 UserService 和 LogService 的兩個方法都設置為 REQUIRES_NEW

此時就是無論 A 有沒有事務, B 都新創(chuàng)建事務,所以當 B 的一個方法有異常時,是不會影響其他方法的

4.3. NEVER

如果設置為 NEVER 的話,A 調用 B,A 如果存在事務,就會報錯

把 A 的事務取消掉就不會報錯了

4.4. NESTED

NESTED 是如果當前存在事務,則創(chuàng)建一個事務作為當前事務的嵌套事務來運行,所以說 A 和 B 不是同一個事務,那么當 B 的一個方法出現異常時進行回滾,另一個 A 調用的方法是不受影響的,也印證了這兩個不是同一個事務,確實是創(chuàng)建了一個嵌套事務

和 REQUIRED 不同的是,那里用的是同一個事務,其中一個回滾,都要回滾,這里可以只是自己的事務進行回滾,也就是實現局部回滾

到此這篇關于詳解Spring事務和事務傳播機制的文章就介紹到這了,更多相關Spring 事務和事務傳播機制內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • JAVA基于PDF box將PDF轉為圖片的實現方法

    JAVA基于PDF box將PDF轉為圖片的實現方法

    這篇文章主要介紹了JAVA基于PDF box將PDF轉為圖片的操作方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2019-07-07
  • 自動配置@EnableAutoConfiguration問題

    自動配置@EnableAutoConfiguration問題

    這篇文章主要介紹了自動配置@EnableAutoConfiguration問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 如何自定義hibernate validation注解示例代碼

    如何自定義hibernate validation注解示例代碼

    Hibernate Validator 是 Bean Validation 的參考實現 . Hibernate Validator 提供了 JSR 303 規(guī)范中所有內置 constraint 的實現,下面這篇文章主要給大家介紹了關于如何自定義hibernate validation注解的相關資料,需要的朋友可以參考下
    2018-04-04
  • Spring 3.x中三種Bean配置方式比較詳解

    Spring 3.x中三種Bean配置方式比較詳解

    這篇文章主要介紹了Spring 3.x中三種Bean配置方式比較詳解,具有一定借鑒價值,需要的朋友可以參考下
    2017-12-12
  • 解讀classpath讀取resources目錄下的文件

    解讀classpath讀取resources目錄下的文件

    這篇文章主要介紹了解讀classpath讀取resources目錄下的文件,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 完美解決PermGen space異常的問題

    完美解決PermGen space異常的問題

    這篇文章主要介紹了完美解決PermGen space異常的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • spring中的BeanFactory與FactoryBean的講解

    spring中的BeanFactory與FactoryBean的講解

    今天小編就為大家分享一篇關于spring中的BeanFactory與FactoryBean的講解,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • 高內聚低耦合法則實例解析

    高內聚低耦合法則實例解析

    這篇文章主要介紹了高內聚低耦合法則實例代碼解析,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • SpringBoot自定義全局異常處理器的問題總結

    SpringBoot自定義全局異常處理器的問題總結

    Springboot框架提供兩個注解幫助我們十分方便實現全局異常處理器以及自定義異常,處理器會優(yōu)先處理更具體的異常類型,如果沒有找到匹配的處理器,那么它會尋找處理更一般異常類型的處理器,本文介紹SpringBoot自定義全局異常處理器的問題,一起看看吧
    2024-01-01
  • java實現ssh連接服務器的方法步驟

    java實現ssh連接服務器的方法步驟

    本文主要介紹了java實現ssh連接服務器的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-09-09

最新評論

绵阳市| 闽清县| 鄱阳县| 西城区| 罗源县| 嘉黎县| 永城市| 贵阳市| 永清县| 抚松县| 罗平县| 原阳县| 屏东县| 宿州市| 香河县| 万州区| 秦皇岛市| 开平市| 景东| 原平市| 将乐县| 博兴县| 施甸县| 鄢陵县| 岳池县| 南川市| 金乡县| 正安县| 无为县| 图片| 黎平县| 平南县| 库伦旗| 二连浩特市| 普格县| 香河县| 清水河县| 天津市| 舒城县| 太康县| 株洲县|