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

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

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

服務器之家 - 編程語言 - Java教程 - Spring事務失效的一種原因關于this調用的問題

Spring事務失效的一種原因關于this調用的問題

2022-03-07 00:54weixin_33976072 Java教程

這篇文章主要介紹了Spring事務失效的一種原因關于this調用的問題,本文給大家分享問題原因及解決辦法,通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下

  • PROPAGATION_REQUIRED: 如果存在一個事務,則支持當前事務。如果沒有事務則開啟事務;
  • PROPAGATION_REQUIRES_NEW:總是開啟一個新的事務。如果一個事務已經存在,則將這個存在的事務掛起;

問題:

Spring中一個沒有事務的方法A調用一個默認事務(PROPAGATION_REQUIRED)的方法B時,如果使用this調用方法B,方法B拋出RuntimeException,此時方法B事務未生效,不會回滾。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Service
public class EmployeeService {
 
    @Autowired
    private EmployeeDao employeeDao;
 
    public void save(){
        try {       
            this.saveEmployee();  //此處this調用不會開啟事務,數據會被保存
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    
    @Transactional(propagation = Propagation.PROPAGATION_REQUIRED)
    //此處無論是PROPAGATION_REQUIRED還是PROPAGATION_REQUIRES_NEW,事務均不生效
    public void saveEmployee(){
        Employee employee = new Employee();
        employee.setName("zhangsan");
        employee.setAge("26";
        employeeDao.save(employee);
        throw new RuntimeException();
    }
}

問題原因:

JDK的動態代理。只有被動態代理直接調用時才會產生事務。在SpringIoC容器中返回的調用的對象是代理對象而不是真實的對象。而這里的this是EmployeeService真實對象而不是代理對象。

解決辦法:

方法1、在方法A上開啟事務,方法B不用事務或默認事務,并在方法A的catch中throw new RuntimeException();(在沒指定rollbackFor時,默認回滾的異常為RuntimeException),這樣使用的就是方法A的事務。(一定要throw new RuntimeException();否則異常被捕捉處理,同樣不會回滾。)如下:

?
1
2
3
4
5
6
7
8
9
@Transactional() //開啟事務
public void save(){
    try {       
        this.saveEmployee();  //這里this調用會使事務失效,數據會被保存
    }catch (Exception e){
        e.printStackTrace();
        throw new RuntimeException();
    }
}

方法2、方法A上可以不開啟事務,方法B上開啟事務,并在方法A中將this調用改成動態代理調用(AopContext.currentProxy()),如下:

?
1
2
3
4
5
6
7
8
public void save(){
    try {       
        EmployeeService proxy =(EmployeeService) AopContext.currentProxy();
        proxy.saveEmployee();
    }catch (Exception e){
        e.printStackTrace();
    }
}

到此這篇關于spring事務調用失效問題的文章就介紹到這了,更多相關spring事務調用失效問題內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/weixin_33976072/article/details/88113917

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产码一区二区三区 | 青青国产精品 | 青青草原社区 | 精品国产免费第一区二区三区日韩 | 美女黄板视频 | 亚洲精品第五页中文字幕 | 久久精品在现线观看免费15 | 国产成人啪精品午夜在线播放 | 日韩风月片 | 色婷亚洲 | 亚洲精品成人A8198A片漫画 | 国产精品国产三级国产专区不 | 校花被吃奶还摸下面 | 91无套极品外围在线播放 | 欧美在线一级片 | 欧美性色欧美a在线播放 | avtt在线播放 | 午夜性色一区二区三区不卡视频 | 日本在线www | 日韩欧美在线视频一区二区 | 沟厕okn系列在线播放 | 国产成人亚洲精品乱码在线观看 | 胸奶好大好紧好湿好爽 | 久久久免费热线精品频 | 国产一级特黄在线播放 | 亚洲激情偷拍 | 成人精品视频一区二区在线 | 亚洲欧美成人综合久久久 | 小早川怜子在线播放精品 | ady成人映画网站官网 | 法国女佣系列在线播放 | 国产精品美女久久久久 | 久久午夜夜伦痒痒想咳嗽P 久久无码AV亚洲精品色午夜麻豆 | 成人国产一区 | 99这里只有精品在线 | 国产精品66福利在线观看 | gaygayas男男免费中国 | 成人国产在线视频在线观看 | 国产51 | 久久日本片精品AAAAA国产 | 99色在线视频 |