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

解析spring事務(wù)管理@Transactional為什么要添加rollbackFor=Exception.class

 更新時間:2021年11月15日 09:25:41   作者:賣柴火的小伙子  
這篇文章主要介紹了spring事務(wù)管理@Transactional為什么要添加rollbackFor=Exception.class,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

spring中事務(wù)處理原理

    利用aop生成代理對象執(zhí)行帶有Transactional事務(wù)注解的方法業(yè)務(wù)邏輯.項目啟動過程中會生成代理對象并將Transactional注解中的屬性進(jìn)行解析加載處理.在方法執(zhí)行過程中如果出現(xiàn)異常,會根據(jù)注解配置決定是進(jìn)入到事務(wù)回滾處理還是事務(wù)提交處理邏輯中,事務(wù)回滾處理邏輯中最終還是基于數(shù)據(jù)庫的事務(wù)回滾處理.

異常的分類

在這里插入圖片描述

案例說明

    以自定義異常為例說明一下@Transactional中是否指定rollbackFor=Exception.class的區(qū)別
    未指定rollbackFor屬性

  	 @Transactional
    @GetMapping("/addSysMenu")
    public void addSysMenu() throws Exception {
    	// 更新菜單名稱(將id為1的菜單名修改為系統(tǒng)管理測試)
        int k = sysMenuDao.updateSysMenu(1, "系統(tǒng)管理測試");
        System.out.println(k);
        // 自定義異常,拋出非運行期異常
        throw new Exception("自定義異常");
        // 執(zhí)行結(jié)果:程序終止,數(shù)據(jù)庫中菜單id為1的菜單名修改成功.說明事物沒有回滾.
    }

    指定rollbackFor屬性

    @Transactional(rollbackFor = Exception.class)
    @GetMapping("/addSysMenu")
    public void addSysMenu(String menuName) throws Exception {
   		 // 更新菜單名稱(將id為1的菜單名修改為系統(tǒng)管理測試)
        int k = sysMenuDao.updateSysMenu(1, "系統(tǒng)管理測試");
        System.out.println(k);
        // 自定義異常,拋出非運行期異常
        throw new Exception("自定義異常");
         // 執(zhí)行結(jié)果:程序終止,數(shù)據(jù)庫中菜單id為1的菜單名沒有修改.說明事物回滾.
    }

原因分析

    其他帖子都說如果不加的話僅支持運行期異常以及error錯誤類型.對于非運行期異常是不支持的.這里提供一下這種說法的來源.
先看一下@Transactional注解中關(guān)于rollbackFor的使用說明

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {
	// 省略部分代碼............
	// By default, a transaction will be rolling back on {@link RuntimeException} and {@link Error} but not on checked exceptions (business exceptions).
	// 翻譯:指定事物回滾的異常類型,默認(rèn)僅對于運行期異常和錯誤支持事務(wù)回滾,對于檢查異常(業(yè)務(wù)異常是不支持的)
	Class<? extends Throwable>[] rollbackFor() default {};
	}

    至于加上@Transactional中指定rollbackFor=Exception.class以后是如何起作用的接著往下看.
spring中事務(wù)回滾的大概邏輯是,發(fā)生異常之后,會根據(jù)配置的事務(wù)屬性判斷是否進(jìn)行回滾的處理,如果不進(jìn)行事務(wù)回滾則直接進(jìn)行事務(wù)提交.這里重要的體現(xiàn)是在:TransactionAspectSupport.java中completeTransactionAfterThrowing

// 發(fā)生異常時事務(wù)處理方式
protected void completeTransactionAfterThrowing(@Nullable TransactionInfo txInfo, Throwable ex) {
		if (txInfo != null && txInfo.getTransactionStatus() != null) {
			// 省略部分代碼.......
			// 判斷異常是否為運行期異?;蚴莈rror,如果是則執(zhí)行回滾處理,如果不是則提交事務(wù)
			if (txInfo.transactionAttribute != null && txInfo.transactionAttribute.rollbackOn(ex)) {
					// 回滾事務(wù)處理
					txInfo.getTransactionManager().rollback(txInfo.getTransactionStatus());
					// 省略部分代碼......
			}
			else {
					// 提交事務(wù)
					txInfo.getTransactionManager().commit(txInfo.getTransactionStatus());
					// 省略部分代碼.......
			}
		}
	}

    而判斷事務(wù)是否支持回滾的處理在RuleBasedTransactionAttribute.java中transactionAttribute.rollbackOn()

// 判斷異常是否支持事務(wù)回滾處理
public boolean rollbackOn(Throwable ex) {
	
		RollbackRuleAttribute winner = null;
		// 省略部分代碼....................
		// winner 是判斷@Transactional中是否有rollBackFor屬性,如果沒有則說明沒有指定,按照默認(rèn)的方式進(jìn)行判斷(DefaultTransactionAttribute.java中rollbackOn),如果有則只判斷是否屬于NoRollbackRuleAttribute類型,如果不是則說明支持事務(wù)回滾.關(guān)于變量win對應(yīng)的RollbackRuleAttribute如何進(jìn)行的賦值下面繼續(xù).
		if (winner == null) {
			return super.rollbackOn(ex);
		}
		return !(winner instanceof NoRollbackRuleAttribute);
	}

    DefaultTransactionAttribute.java中rollbackOn,是否支持事務(wù)回滾的默認(rèn)判斷方式:是否是運行期異?;蚴鞘欠袷清e誤類型(與Transactional注解中的rollbackFor屬性說明相對應(yīng)).

public boolean rollbackOn(Throwable ex) {
		return (ex instanceof RuntimeException || ex instanceof Error);
	}

    RollbackRuleAttribute中如何進(jìn)行的賦值問題,具體來講是項目啟動之后會掃描帶有Transactional注解的方法,然后將注解中標(biāo)注的屬性獲取之后進(jìn)行參數(shù)配置.具體體現(xiàn)是在:SpringTransactionAnnotationParser.java中parseTransactionAnnotation

protected TransactionAttribute parseTransactionAnnotation(AnnotationAttributes attributes) {
		RuleBasedTransactionAttribute rbta = new RuleBasedTransactionAttribute();
		// 省略部分代碼.........
		// 獲取注解上的rollbackFor屬性值
		List<RollbackRuleAttribute> rollbackRules = new ArrayList<>();
		for (Class<?> rbRule : attributes.getClassArray("rollbackFor")) {
			rollbackRules.add(new RollbackRuleAttribute(rbRule));
		}
		// 省略部分代碼.........

		return rbta;
	}

    至此關(guān)于為什么@Transactional為什么要添加rollbackFor=Exception.class原因以講述完畢!

到此這篇關(guān)于spring事務(wù)管理@Transactional為什么要添加rollbackFor=Exception.class的文章就介紹到這了,更多相關(guān)spring事務(wù)管理@Transactional內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Springboot如何配置多個Redis數(shù)據(jù)源(非集群)

    Springboot如何配置多個Redis數(shù)據(jù)源(非集群)

    這篇文章主要介紹了Springboot如何配置多個Redis數(shù)據(jù)源(非集群)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • Java 中的偽共享詳解及解決方案

    Java 中的偽共享詳解及解決方案

    這篇文章主要介紹了Java 中的偽共享詳解及解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • java數(shù)據(jù)結(jié)構(gòu)與算法之快速排序詳解

    java數(shù)據(jù)結(jié)構(gòu)與算法之快速排序詳解

    這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)與算法之快速排序,結(jié)合實例形式詳細(xì)分析了快速排序的原理、實現(xiàn)步驟、相關(guān)操作技巧與注意事項,需要的朋友可以參考下
    2017-05-05
  • Spring Boot 中密碼加密的兩種方法

    Spring Boot 中密碼加密的兩種方法

    這篇文章主要介紹了Spring Boot 中密碼加密的兩種方法,幫助大家更好的理解和使用Spring Boot框架,感興趣的朋友可以了解下
    2020-09-09
  • java如何通過FileOutputStream字節(jié)流向文件中寫數(shù)據(jù)

    java如何通過FileOutputStream字節(jié)流向文件中寫數(shù)據(jù)

    這篇文章主要介紹了java如何通過FileOutputStream字節(jié)流向文件中寫數(shù)據(jù)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • ConcurrentHashMap?存儲結(jié)構(gòu)源碼解析

    ConcurrentHashMap?存儲結(jié)構(gòu)源碼解析

    這篇文章主要為大家介紹了ConcurrentHashMap?存儲結(jié)構(gòu)源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • java加密算法分享(rsa解密、對稱加密、md5加密)

    java加密算法分享(rsa解密、對稱加密、md5加密)

    這篇文章主要介紹了java加密算法,包括rsa解密、對稱加密、md5加密等,需要的朋友可以參考下
    2014-05-05
  • 最新評論

    扶沟县| 怀柔区| 琼海市| 锡林浩特市| 呼玛县| 寿阳县| 西贡区| 朝阳区| 翁源县| 孟连| 沽源县| 屏山县| 绍兴县| 龙游县| 香港| 内黄县| 布拖县| 河东区| 娄底市| 嘉峪关市| 万山特区| 南阳市| 绥滨县| 儋州市| 八宿县| 株洲县| 手游| 嵊泗县| 江永县| 平乐县| 晋州市| 沽源县| 方山县| 太原市| 客服| 金平| 隆林| 平潭县| 永吉县| 乐清市| 汶上县|