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

聊聊spring @Transactional 事務無法使用的可能原因

 更新時間:2021年07月17日 11:50:04   作者:居十四  
這篇文章主要介紹了spring @Transactional 事務無法使用的可能原因,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

spring transaction

建議

Spring團隊的建議是你在具體的類(或類的方法)上使用 @Transactional 注解,

而不要使用在類所要實現(xiàn)的任何接口上。你當然可以在接口上使用 @Transactional 注解,

但是這將只能當你設(shè)置了基于接口的代理時它才生效。

因為注解是不能繼承的,

這就意味著如果你正在使用基于類的代理時,那么事務的設(shè)置將不能被基于類的代理所識別,

而且對象也將不會被事務代理所包裝(將被確認為嚴重的)。

因此請接受Spring團隊的建議并且在具體的類上使用 @Transactional 注解。

事務無法使用的可能原因

導入spring的事務注解

應該是

org.springframework.transaction.annotation.Transactional

而不是

javax.transaction.Transactional

是否開啟了對注解的解析:

xml 文件配置

<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

springboot

注解開啟自動掃描

@EnableTransactionManagement

spring是否掃描到你使用注解事務的這個類所在的包

配置xml

<context:component-scan base-package="com.xxx.xxx" ></context:component-scan>

springboot 開啟事務

@EnableTransactionManagement

數(shù)據(jù)庫引擎要支持事務

如果是mysql,注意表要使用支持事務的引擎,比如InnoDB,如果是myisam,事務是不起作用的

springboot的配置

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

檢查方法是不是public的

@Transactional 僅僅在 public 方法,才能進行事務管理。

photo_1

這是因為在使用 Spring AOP 代理時,

Spring 在調(diào)用在圖中的 TransactionInterceptor 在目標方法執(zhí)行前后進行攔截之前(圖中是cglib代理)

DynamicAdvisedInterceptor(CglibAopProxy 的內(nèi)部類)的的 intercept 方法或 JdkDynamicAopProxy 的 invoke 方法會間接調(diào)用 AbstractFallbackTransactionAttributeSource ,而會去調(diào)用computeTransactionAttribute 方法。

protected TransactionAttribute computeTransactionAttribute(Method method,
    Class<?> targetClass) {
        // Don't allow no-public methods as required.
        if (allowPublicMethodsOnly() && !Modifier.isPublic(method.getModifiers())) {
   return null;
  }
 }

這個方法會判斷如果不是 public 則會返回 null

異常類型是不是unchecked異常

默認,只有unchecked異常時才回滾該事務

spring只有在拋出的異常為運行時unchecked異常時才回滾該事務,

也就是拋出的異常為RuntimeException的子類(Errors也會導致事務回滾).

而拋出checked異常則不會導致事務回滾。可以明確的配置在拋出那些異常時回滾事務,

包括checked異常。也可以明確定義那些異常拋出時不回滾事務。

如果想讓checked異常也回滾,在注解上面寫明異常類型即可:

@Transactional (rollbackFor=Exception.class)

noRollbackFor 自定義不回滾的異常

異常是不是被catch住了

Service層捕捉異常后,發(fā)現(xiàn)事務不生效。

Service層手工捕捉并處理了異常(try…catch)等于把異常吃掉了,

Spring自然不知道這里有錯,更不會主動去回滾數(shù)據(jù)。推薦做法是在Service層統(tǒng)一拋出異常,

然后在Controll層統(tǒng)一處理。

下面代碼事務是無法生效的

//在類上@Transactional 說明,所以public都是有事務的
@Service
@Transactional
public class StudentService {

	@Autowired
	private GroupRepository groupRepository;
	@Autowired
	private InstituteRepository instituteRepository;

	public void initStudent() {
		Institute institute = Institute.builder().build();
		institute.setCode("TEST4");
		instituteRepository.save(institute);
		
		// 這里自己處理異常,spring不會知道存在異常,無法進行事務回滾
		try {
			throw new RuntimeException("運行時異常----------看事務是否起作用");
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}

修改成如下代碼

public void initStudent() throws Exception{
  Institute institute = Institute.builder().build();
  institute.setCode("TEST4");
  instituteRepository.save(institute);
  groupRepository.save(group);
  
  //不進行異常處理,而是把異常拋出
  throw new RuntimeException("運行時異常----------看事務是否起作用");
 }

避免 Spring 的 AOP 的自調(diào)用問題

檢查是不是同一個類中的方法調(diào)用(如a方法調(diào)用同一個類中的b方法),從而避免 Spring AOP 的自調(diào)用問題

這是因為在 Spring AOP 代理下,只有目標方法由外部調(diào)用,

目標方法才由 Spring 生成的代理對象來管理,這會造成自調(diào)用問題。

若同一類中的其他沒有@Transactional 注解的方法內(nèi)部調(diào)用有@Transactional 注解的方法,

@Transactional 注解的方法的事務被忽略,不會發(fā)生回滾。

@Service
public class StudentService {

 @Autowired
 private GroupRepository groupRepository;
 @Autowired
 private InstituteRepository instituteRepository;
 
 //initStudent() 加上@Transactional(),則會回滾
 public void initStudent() throws Exception{
  Institute institute = Institute.builder().build();
  institute.setCode("TEST4");
  instituteRepository.save(institute);
  
  //雖然 initGroup() 有 @Transactional() 但是事務還是沒起作用
  initGroup();
  throw new RuntimeException("運行時異常----------看事務是否起作用");
 }
 
 @Transactional()
 public void initGroup() {
  Group group = Group.builder().academic_year(2015).build();
  group.setCode("ELSE1");
  groupRepository.save(group);
 }
}

AspectJ 取代 Spring AOP 代理

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

相關(guān)文章

  • SpringBoot之使用Redis實現(xiàn)分布式鎖(秒殺系統(tǒng))

    SpringBoot之使用Redis實現(xiàn)分布式鎖(秒殺系統(tǒng))

    這篇文章主要介紹了SpringBoot之使用Redis實現(xiàn)分布式鎖(秒殺系統(tǒng)),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • IDEA解決Java:程序包xxxx不存在的問題

    IDEA解決Java:程序包xxxx不存在的問題

    這篇文章主要介紹了IDEA解決Java:程序包xxxx不存在的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • SpringMVC通過注解獲得參數(shù)的實例

    SpringMVC通過注解獲得參數(shù)的實例

    下面小編就為大家?guī)硪黄猄pringMVC通過注解獲得參數(shù)的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • SpringBoot實現(xiàn)國際化的教程

    SpringBoot實現(xiàn)國際化的教程

    這篇文章主要介紹了SpringBoot實現(xiàn)國際化的教程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • SpringBoot整合Shiro實現(xiàn)權(quán)限控制的代碼實現(xiàn)

    SpringBoot整合Shiro實現(xiàn)權(quán)限控制的代碼實現(xiàn)

    Apache Shiro是一個強大且易用的Java安全框架,執(zhí)行身份驗證、授權(quán)、密碼和會話管理,今天通過本文給大家介紹SpringBoot整合Shiro實現(xiàn)權(quán)限控制的方法,感興趣的朋友一起看看吧
    2021-07-07
  • SpringMVC一步到位精通攔截器

    SpringMVC一步到位精通攔截器

    攔截器(Interceptor)是一種動態(tài)攔截方法調(diào)用的機制,在SpringMVC中動態(tài)攔截控制器方法的執(zhí)行。本文將詳細講講SpringMVC中攔截器的概念及入門案例,感興趣的可以嘗試一下
    2022-12-12
  • java9中g(shù)c log參數(shù)遷移

    java9中g(shù)c log參數(shù)遷移

    本篇文章給大家詳細講述了java9中g(shù)c log參數(shù)遷移的相關(guān)知識點,對此有需要的朋友可以參考學習下。
    2018-03-03
  • mybatis-plus版本不兼容問題的解決

    mybatis-plus版本不兼容問題的解決

    本文主要介紹了mybatis-plus與spring-boot3版本不兼容導致的BeanDefinitionStoreException問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-12-12
  • 阿里的一道Java并發(fā)面試題詳解

    阿里的一道Java并發(fā)面試題詳解

    這篇文章主要介紹了阿里的一道Java并發(fā)面試題詳解,網(wǎng)絡(luò)、并發(fā)相關(guān)的知識,相對其他一些編程知識點更難一些,主要是不好調(diào)試并且涉及內(nèi)容太多 !,需要的朋友可以參考下
    2019-06-06
  • Java的位圖和布隆過濾器深入詳細講解

    Java的位圖和布隆過濾器深入詳細講解

    這篇文章主要介紹了Java的位圖和布隆過濾器,在學習之前的數(shù)據(jù)結(jié)構(gòu)的時候,我們使用的數(shù)據(jù)量都不是很大,但是在生活中,我們常常面臨著要處理大量數(shù)據(jù)結(jié)果并得出最終結(jié)果,那么有沒有什么數(shù)據(jù)結(jié)構(gòu)可以幫助我們實現(xiàn)這樣的功能呢,想要繼續(xù)了解的朋友可以參考下
    2024-10-10

最新評論

垦利县| 青神县| 信阳市| 历史| 嘉峪关市| 赤壁市| 沅江市| 丁青县| 大城县| 永川市| 汶川县| 昌平区| 新野县| 陇西县| 营山县| 井陉县| 乌兰浩特市| 夹江县| 米脂县| 富宁县| 循化| 新源县| 阜新市| 阜新市| 大安市| 阜新市| 罗城| 波密县| 阳山县| 北海市| 永泰县| 承德县| 镇巴县| 永昌县| 原平市| 竹溪县| 台北市| 朝阳区| 永德县| 咸阳市| 鹤壁市|