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

SpringBoot中的事務處理問題

 更新時間:2024年01月12日 10:18:40   作者:龍域、白澤  
這篇文章主要介紹了SpringBoot中的事務處理問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

介紹

在實際的業(yè)務場景中,不光數據庫要實現(xiàn)事務,我們的Service層業(yè)務也要實現(xiàn)事務。

例如:要實現(xiàn)數據的刪除,刪除數據庫中的數據并刪除Redis緩存中的數據,他們在一個ServiceImpl的方法中,我們要實現(xiàn)這兩個操作放在一個事務中,兩個操作同時成功 / 失敗,所有,要使用Spring事務。

SpringBoot中事務實現(xiàn)

ServiceImpl的方法 / ServiceImpl類 上加上@Transactional。

  • 方法:注解只對public方法有效(因為@Transactional 工作原理是基于AOP實現(xiàn)的),如果在 protected、private 或者默認方法上使用,沒有作用,也不報錯。
  • 類:該類的所有 public 方法將都具有該類型的事務屬性

注意:在方法級別使用該注解可以覆蓋類級別使用該注解。

// 這個類中的public方法如果拋出Exception,則該方法會回滾
@Transactional(rollbackFor = Exception.class)
public class DefaultFooService implements FooService {
 
  public Foo getFoo(String fooName) {
    // do something
  }
 
  // these settings have precedence for this method
  //方法上注解屬性會覆蓋類注解上的相同屬性
  @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
  public void updateFoo(Foo foo) {
    // do something
  }
}

@EnableTransactionManagement

SpringBoot啟動類上加上不用加@EnableTransactionManagement注解,SpringBoot自動裝配已經幫我們處理了,SpringBoot項目默認支持事務。

@Transactional

作用位置:接口、接口方法、類以及類方法

Spring 建議不要在接口或者接口方法上使用該注解,因為這只有在使用基于接口的代理時它才會生效。

注意:

默認情況下,只有來自外部的方法調用才會被AOP代理捕獲,也就是,類內部方法調用本類內部的其他方法并不會引起事務行為,即使被調用方法使用@Transactional注解進行修飾。

Transactional類

package org.springframework.transaction.annotation;
 
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
import org.springframework.core.annotation.AliasFor;
import org.springframework.transaction.TransactionDefinition;
 
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {
 
	@AliasFor("transactionManager")
	String value() default "";
 
	@AliasFor("value")
	String transactionManager() default "";
 
	Propagation propagation() default Propagation.REQUIRED;
 
	Isolation isolation() default Isolation.DEFAULT;
 
	int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;
 
	boolean readOnly() default false;
 
	Class<? extends Throwable>[] rollbackFor() default {};
 
	String[] rollbackForClassName() default {};
 
	Class<? extends Throwable>[] noRollbackFor() default {};
 
	String[] noRollbackForClassName() default {};
}

注解的屬性

屬性類型描述
valueString可選的限定描述符,指定使用的事務管理器
propagationenum: Propagation可選的事務傳播行為設置
isolationenum: Isolation可選的事務隔離級別設置
readOnlyboolean讀寫或只讀事務,默認讀寫
timeoutint (in seconds granularity)事務超時時間設置
rollbackForClass對象數組,必須繼承自Throwable導致事務回滾的異常類數組
rollbackForClassName類名數組,必須繼承自Throwable導致事務回滾的異常類名字數組
noRollbackForClass對象數組,必須繼承自Throwable不會導致事務回滾的異常類數組
noRollbackForClassName類名數組,必須繼承自Throwable不會導致事務回滾的異常類名字數組

在Spring中定義了五種隔離級別常量

一般用默認就可以。

package org.springframework.transaction.annotation;
 
import org.springframework.transaction.TransactionDefinition;
 
public enum Isolation {
 
	DEFAULT(TransactionDefinition.ISOLATION_DEFAULT),
 
	READ_UNCOMMITTED(TransactionDefinition.ISOLATION_READ_UNCOMMITTED),
 
	READ_COMMITTED(TransactionDefinition.ISOLATION_READ_COMMITTED),
 
	REPEATABLE_READ(TransactionDefinition.ISOLATION_REPEATABLE_READ),
	
	SERIALIZABLE(TransactionDefinition.ISOLATION_SERIALIZABLE);
 
 
	private final int value;
 
	Isolation(int value) {
		this.value = value;
	}
 
	public int value() {
		return this.value;
	}
}
常量說明
TransactionDefinition.ISOLATION_DEFAULT數據庫默認的隔離級別,MySQL默認采用的 REPEATABLE_READ隔離級別
TransactionDefinition.ISOLATION_READ_UNCOMMITTED最低的隔離級別,允許讀取未提交的數據變更,可能會導致臟讀、幻讀或不可重復讀。
TransactionDefinition.ISOLATION_READ_COMMITTED允許讀取并發(fā)事務已經提交的數據,可以阻止臟讀,但是幻讀或不可重復讀仍有可能發(fā)生。
TransactionDefinition.ISOLATION_REPEATABLE_READ對同一字段的多次讀取結果都是一致的,除非數據是被本身事務自己所修改,可以阻止臟讀和不可重復讀,但幻讀仍有可能發(fā)生。MySQL中通過MVCC解決了該隔離級別下出現(xiàn)幻讀的可能。
TransactionDefinition.ISOLATION_SERIALIZABLE串行化隔離級別,該級別可以防止臟讀、不可重復讀以及幻讀,但是串行化會影響性能。

Spring定義了七種事務傳播行為

類型說明
PROPAGATION_REQUIRED如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇
PROPAGATION_SUPPORTS支持當前事務,如果當前沒有事務,就以非事務方式執(zhí)行。
PROPAGATION_MANDATORY使用當前的事務,如果當前沒有事務,就拋出異常。
PROPAGATION_REQUIRES_NEW新建事務,如果當前存在事務,把當前事務掛起。
PROPAGATION_NOT_SUPPORTED以非事務方式執(zhí)行操作,如果當前存在事務,就把當前事務掛起。
PROPAGATION_NEVER以非事務方式執(zhí)行,如果當前存在事務,則拋出異常。
PROPAGATION_NESTED如果當前存在事務,則在嵌套事務內執(zhí)行。如果當前沒有事務,則執(zhí)行與PROPAGATION_REQUIRED類似的操作。

Spring事務什么情況下會失效

【1】@Transactional 應用在非 public 修飾的方法上

@Transactional 工作原理是基于AOP實現(xiàn)的

所以,注解必須作用在public的方法上,否則失效。

【2】數據庫引擎是否支持事務(MySql的MyIsam引擎不支持事物)

【3】@Transactional注解屬性 propagation 設置錯誤

  • TransactionDefinition.PROPAGATION_SUPPORTS:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續(xù)運行。
  • TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事務方式運行,如果當前存在事務,則把當前事務掛起。
  • TransactionDefinition.PROPAGATION_NEVER:以非事務方式運行,如果當前存在事務,則拋出異。

【4】@Transactional 注解屬性 rollbackFor 設置錯誤?       

  • Spring默認是回滾RuntimeException才回滾。
  • 當然自定義的RuntimeException異常類也是可以的。
  • 如果希望Spring能夠回滾別類型的異常,那就需要使用rollbackFor去指定(當然如果是指定異常的子類,也同樣會回滾)。

【5】同一個類中方法調用,導致@Transactional失效?       

在同一個類中,沒有加事務的方法A調用加事務的方法B,方法B的事務失效。

( 其實這還是由于使用Spring AOP代理造成的),所以:建議把整個類加上事務注解。

【6】異常被捕獲了?        

這個就比較簡單了,就是你自己捕捉到了異常,并且自己處理,并不會拋出到上層的方法調用。

那就不會生效了。

@Transactional
public void contextLoads() {
    try {
        int i = 0;
    }catch (Exception e){
        System.out.println("不可以回滾");
    }
}

可以手動設置回滾

@Transactional
public void contextLoads() {
    try {
        int i = 0;
    }catch (Exception e){
        // 手動回滾
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        System.out.println("可以回滾");
    }
}

【7】新開啟一個線程        

Spring實現(xiàn)事務的原理是通過ThreadLocal把數據庫連接綁定到當前線程中,新開啟一個線程獲取到的連接就不是同一個了。

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 關于Java集合框架面試題(含答案)上

    關于Java集合框架面試題(含答案)上

    Java集合框架為Java編程語言的基礎,也是Java面試中很重要的一個知識點。這里,我列出了一些關于Java集合的重要問題和答案。
    2015-12-12
  • 5種必會的Java異步調用轉同步的方法你會幾種

    5種必會的Java異步調用轉同步的方法你會幾種

    這篇文章主要介紹了5種必會的Java異步調用轉同步的方法你會幾種,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • Java實現(xiàn)圖片百葉窗效果(附源碼)

    Java實現(xiàn)圖片百葉窗效果(附源碼)

    在數字圖像處理領域,各種特效的實現(xiàn)不僅能夠提升圖片的美觀性,也能為后續(xù)的視頻合成、動畫制作提供基礎素材,使用 Java 語言結合 AWT/Swing 或 JavaFX,可以實現(xiàn)對圖像的像素級操作,以達到百葉窗特效,本文給大家介紹的非常詳細,感興趣的小伙伴跟著小編一起來看看吧
    2025-05-05
  • Java中Builder模式的實現(xiàn)詳解

    Java中Builder模式的實現(xiàn)詳解

    在設計模式中對Builder模式的定義是用于構建復雜對象的一種模式,所構建的對象往往需要多步初始化或賦值才能完成。下面這篇文章主要給大家介紹了在Java各個版本中Builder模式實現(xiàn)的相關資料,文中介紹的非常詳細,需要的朋友可以參考學習。
    2017-05-05
  • Java數據結構之單鏈表的實現(xiàn)與面試題匯總

    Java數據結構之單鏈表的實現(xiàn)與面試題匯總

    由于順序表的插入刪除操作需要移動大量的元素,影響了運行效率,因此引入了線性表的鏈式存儲——單鏈表。本文為大家介紹了單鏈表的實現(xiàn)與面試題匯總,感興趣的可以了解一下
    2022-10-10
  • Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections.Transformer異常

    Caused by: java.lang.ClassNotFoundException: org.apache.comm

    這篇文章主要介紹了Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type異常,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • JAVA常用分布式鎖Redisson詳解

    JAVA常用分布式鎖Redisson詳解

    Redisson分布式鎖通過Lua腳本的原子性、可重入設計、Watchdog 自動續(xù)期和Pub/Sub 通知機制,實現(xiàn)了高效的分布式鎖管理,本文給大家介紹JAVA常用分布式鎖Redisson詳解,感興趣的朋友一起看看吧
    2025-05-05
  • 一文帶你玩轉Java異常處理

    一文帶你玩轉Java異常處理

    這篇文章主要為大家介紹一下Java中的異常處理機制,文中通過示例為大家進行了詳細的介紹,對我們學習有一定的幫助,感興趣的可以了解一下
    2022-08-08
  • 12個SpringBoot配置文件的實用技巧分享

    12個SpringBoot配置文件的實用技巧分享

    配置文件是SpringBoot應用的核心組成部分,它決定了應用的行為、連接參數以及功能特性,本文為大家整理了12個SpringBoot配置文件的實用技巧,有需要的可以了解下
    2025-05-05
  • 深入理解Java設計模式之抽象工廠模式

    深入理解Java設計模式之抽象工廠模式

    這篇文章主要介紹了JAVA設計模式之抽象工廠模式的的相關資料,文中示例代碼非常詳細,供大家參考和學習,感興趣的朋友可以了解下
    2021-11-11

最新評論

江西省| 营口市| 景宁| 固安县| 凌源市| 怀柔区| 皋兰县| 深圳市| 华阴市| 化州市| 彰化县| 会昌县| 筠连县| 定州市| 沈丘县| 加查县| 忻州市| 景德镇市| 侯马市| 金坛市| 舟山市| 兰考县| 九龙县| 子洲县| 巴林右旗| 永城市| 安徽省| 建湖县| 长丰县| 偏关县| 玛曲县| 东乡| 新民市| 晋江市| 乐平市| 巴彦县| 于田县| 赤水市| 临邑县| 芮城县| 凭祥市|