一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 聊聊spring @Transactional 事務無法使用的可能原因

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

2021-10-15 11:22居十四 Java教程

這篇文章主要介紹了spring @Transactional 事務無法使用的可能原因,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

spring transaction

建議

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

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

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

因為注解是不能繼承的,

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

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

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

事務無法使用的可能原因

導入spring的事務注解

應該是

?
1
org.springframework.transaction.annotation.Transactional

而不是

?
1
javax.transaction.Transactional

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

xml 文件配置

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

springboot

注解開啟自動掃描

?
1
@EnableTransactionManagement

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

配置xml

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

springboot 開啟事務

?
1
@EnableTransactionManagement

數據庫引擎要支持事務

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

springboot的配置

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

檢查方法是不是public的

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

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

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

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

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

?
1
2
3
4
5
6
7
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異常也回滾,在注解上面寫明異常類型即可:

?
1
@Transactional (rollbackFor=Exception.class)

noRollbackFor 自定義不回滾的異常

異常是不是被catch住了

Service層捕捉異常后,發現事務不生效。

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

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

然后在Controll層統一處理。

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//在類上@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();
        }
 
    }
}

修改成如下代碼

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

避免 Spring 的 AOP 的自調用問題

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

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

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

若同一類中的其他沒有@Transactional 注解的方法內部調用有@Transactional 注解的方法,

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@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 代理

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

原文鏈接:https://blog.csdn.net/qq_34120430/article/details/88913679

延伸 · 閱讀

精彩推薦
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7472021-02-04
主站蜘蛛池模板: 国产一级一级片 | avtt在线观看 | 韩日理论片 | 国产性做久久久久久 | yy8090韩国日本三理论免费 | 国产成人免费视频 | 贤妻良母电影日本 | 四虎网站 | 538精品视频 | 天美影视传媒mv直接看 | 男人使劲躁女人视频免费 | 韩国甜性涩爱在线播放 | avidolz中文版| 丰满肥臀风间由美357在线 | 99精品国产自在现线观看 | 久久伊人在 | 国产成人lu在线视频 | fc2成人免费共享视频 | 女人c交zzzooo在线观看 | 五月色综合婷婷综合俺来也 | 日本免费观看95视频网站 | 国产欧美日韩在线观看精品 | 给我免费观看的视频在线播放 | 91无毒不卡 | 国产一卡二卡四卡免费 | 日本精品久久久久久久久免费 | 午夜办公室| 91传媒制片厂制作传媒破解版 | 国产午夜精品一区二区三区 | 亚洲性视频在线观看 | free白嫩性hd | 亚洲一区二区三区深夜天堂 | 成人四虎 | 九色PORNY真实丨国产大胸 | 欧美日韩精品一区二区三区高清视频 | 嫩草在线观看视频 | 欧美视频在线播放观看免费福利资源 | 国内精品中文字幕 | 三级黄片毛片 | 国产精品免费综合一区视频 | 国产精品videosse |