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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: а天堂中文最新版在线官网视频 | bl超h 高h 污肉快穿np | 国产午夜亚洲精品不卡 | 国产小视频网站 | 国产精品久久久久久爽爽爽 | 精品国产区一区二区三区在线观看 | 精品国产综合区久久久久久 | 国产精品久久久久不卡绿巨人 | 国产午夜精品不卡视频 | 午夜亚洲WWW湿好爽 午夜想想爱午夜剧场 | 夫妇交换小说全文阅读 | 日本老妇乱子伦中文视频 | 国产精品中文字幕 | 亚洲色图欧美视频 | a在线观看欧美在线观看 | 天天做天天玩天天爽天天 | 国产高清一区二区 | 亚洲色影 | 天堂色| 91人成尤物在线 | sss在线观看免费视频 | 国产成人免费高清激情明星 | 国内揄拍国内精品久久 | 给我免费的视频在线观看 | 亚洲欧美日韩综合在线 | japanese人妖xvideos | 亚洲高清无码在线 视频 | 东方影视欧美天天影院 | 日韩影院在线观看 | 国产精品毛片va一区二区三区 | 3d欧美人与禽交 | 99视频全部免费 | 午夜成私人影院在线观看 | 99热精品69堂国产 | 国产在线一区二区视频 | 91制片厂果冻传媒杨柳作品 | 精品国产成人a区在线观看 精品高潮呻吟99AV无码视频 | 午夜福利08550 | 草久久网| 精品久久99麻豆蜜桃666 | 成年人在线观看免费视频 |