国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Spring事務的一道面試題

開發
每次聊起Spring事務,好像很熟悉,又好像很陌生。本篇通過一道面試題和一些實踐,來拆解幾個Spring事務的常見坑點。

每次聊起Spring事務,好像很熟悉,又好像很陌生。本篇通過一道面試題和一些實踐,來拆解幾個Spring事務的常見坑點。

原理

Spring事務的原理是:通過AOP切面的方式實現的,也就是通過代理模式去實現事務增強。

具體過程是:對包含@Transactional注解的方法進行攔截,然后重寫,重新在方法里加入異常回滾的邏輯。而且,每個線程都是獨立管理自己的事務,相互隔離。

原理簡單,使用起來也簡單,也就是在方法上打上@Transactional注解,然后事務就正常生效了。也很少有人去驗證異常情況下是否能真正的回滾。

Spring事務讓我熟悉的地方是哪哪看起來都簡單,讓我陌生的地方使用時的變種較多,有時候莫名其妙的不生效。

1.源碼

以上原理的相關源碼如下:

2.實踐出真知

但是 [半支煙] 偶爾會在編碼過程中發現有些場景下的事務是失效的,總有些情況讓你想不到,總有一些坑點等你去跳。

[半支煙] 覺得驗證事務的最好方式就是:記住基本原則 + 動手實踐。記住基本原則可以快速處理常規問題,動手實踐可以驗證偏門問題或者不確定的問題。

幾種事務不生效的用法

如下是常見的幾種Spring事務不生效的用法,有空的讀者一定要牢記,對日常編碼很有幫助,同時面試時也能說幾句。

1.private方法

Spring是通過AOP代理的方式實現事務增強的,但是private方法無法被代理,所以在private方法上打@Transactional注解是不生效的。

2.final、static修飾的方法

和private方法類似,final和static修飾的方法也無法被代理,所以@Transactional注解也不生效。

因為,static是屬于類方法,final修飾的方法無法被重寫,自然也就無法植入事務增強代碼。

3.Bean對象沒有被Spring托管

某個類一定要被Spring托管,那才能通過@Transactional注解去增強事務。如果只有@Transactional注解,而沒有把類交給Spring托管,事務也是不生效的。類似如下情況:

// 此處沒有@Service注解,此類不被spring托管,及時有@Transactional也不生效
public class UserService {

    @Autowired
    private UserMapper userMapper;

    @Transactional
    public final void createAndUpdateUser() {
        createUser();
        updateUserById();
    }

    public void createUser() {
        User user = new User();
        user.setId(2L);
        user.setName("test2");
        user.setEmail("test2" + "@test.com");
        userMapper.insert(user);
        System.out.println("create user");
    }

    public void updateUserById() {
        User user = userMapper.findById(1L);
        user.setName("admin1");
        userMapper.update(user);
        int i = 1 / 0; // 此處會拋出異常
        System.out.println("update user");
    }
}

4.異常被吞掉

如果在業務代碼里,通過try......catch捕獲了異常,同時又沒有繼續拋出異常時,Spring事務也是不生效的。

因為代理增強的邏輯就是要發現了異常,才能回滾事務。如果異常被方法本身吞掉了,則代理會認為沒有異常,從而無法回滾。

5.非RuntimeException異常

Spring事務默認會回滾RuntimeException 及其子類,以及 Error 類型的異常。如果是其余異常,則不會回滾。源碼處可見:

這種非RuntimeException異常場景下,需要做2個動作從而保證事務回滾。

  • 捕獲異常,然后拋出自定義異常。
  • 自行在@Transactional注解中增加@Transactional(rollbackFor = XxxxxxxException.class)屬性。或者直接使用rollbackFor = Exception.class,也就免去了第一步。

6.異步線程的場景

多個線程的場景下,只需要牢記每個線程只管理自己的事務即可。每個線程都有一個獨立的事務上下文,存在ThreadLocal中,所以事務信息在不同線程之間是隔離的。

7.重災區:在同一個類中調用本類的方法

這個失效場景,是最容易出錯的,而且變種還多。在同一個類中調用本類的方法時,牢記以下2點,即可破局:

  • 是否會開啟事務依賴此類的第一個被外部調用的方法。如果此類的第一個被外部調用的方法有@Transactional注解,那事務生效。
  • 調用自己內部方法時,采用的是this.xxxMethod()的方式,這種方式是不會走AOP代理的,所以被調用的內部方法的@Transactional注解不生效。

如果確實需要調用內部方法,并且要事務生效的話,那只能將被調用的內部方法獨立到新的類中,同時交給Spring管理。

一道面試題

以上關于事務不生效的用法都比較好記,只有在同一個類中調用本類的方法場景下存在多種變種。具體請看這道面試題。請問以下createAndUpdateUser方法的事務生效嗎?

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    @Transactional
    public final void createAndUpdateUser() { //注意這里有final修飾
        createUser();
        updateUserById();
    }

    @Transactional
    public void createUser() {
        User user = new User();
        user.setId(2L);
        user.setName("test2");
        user.setEmail("test2" + "@test.com");
        userMapper.insert(user);
        System.out.println("create user");
    }


    @Transactional(rollbackFor = Exception.class)
    public void updateUserById() {
        User user = userMapper.findById(1L);
        user.setName("admin1");
        userMapper.update(user);
        int i = 1 / 0; // 此處會拋出異常
        System.out.println("update user");
    }
}

如果按照重災區:在同一個類中調用本類的方法里提到的2個原則,則事務全部生效。

如果按照final、static修飾的方法里提到的原則,則事務全部不生效。

那結果如何呢?結果是以上方法的事務全部生效。

為什么呢?這里在補充一個原則:final修飾的方法如果帶上@Transactional注解,事務情況按照被調用的方法自身的事務托管情況而定。

因為以上代碼中的createUser方法和updateUserById方法,都有@Transactional注解,所以都生效。

這種特殊情況也實在是讓人瞠目,不過只需要牢記以上幾種不生效的用法即可,誰沒事兒寫這種@Transactional + final的代碼呢?除了面試會問......

總結

本篇主要聊了幾種事務不生效的用戶,有興趣的讀者可以記一下。同時,還出了一道特殊場景的面試題,供讀者自行實踐。希望對你有幫助!

責任編輯:趙寧寧 來源: 程序員半支煙
相關推薦

2018-03-06 15:30:47

Java面試題

2011-05-23 11:27:32

面試題面試java

2023-02-04 18:24:10

SeataJava業務

2009-08-11 14:59:57

一道面試題C#算法

2009-08-11 10:12:07

C#算法

2022-04-08 07:52:17

CSS面試題HTML

2017-11-21 12:15:27

數據庫面試題SQL

2009-08-11 15:09:44

一道面試題C#算法

2023-08-01 08:10:46

內存緩存

2021-05-31 07:55:44

smartRepeatJavaScript函數

2021-10-28 11:40:58

回文鏈表面試題數據結構

2022-02-08 18:09:20

JS引擎解析器

2021-03-16 05:44:26

JVM面試題運行時數據

2011-03-02 10:58:16

SQL server入門面試題

2015-09-02 14:09:19

面試題程序設計

2017-03-10 09:33:16

JavaScript類型

2017-09-13 07:15:10

Python讀寫文件函數

2021-03-27 10:59:45

JavaScript開發代碼

2011-06-14 09:12:03

JavaScript

2018-04-26 11:23:01

Linuxfork程序
點贊
收藏

51CTO技術棧公眾號

狠狠色丁香九九婷婷综合五月| 成人在线看视频| 中文字幕精品视频| 国产亚洲美女精品久久久| 欧美日韩国产999| 美女av一区二区三区| 久久久国产精彩视频美女艺术照福利 | 91嫩草免费看| 日韩精品综合在线| 麻豆影院在线| 手机在线电影一区| 9l国产精品久久久久麻豆| 欧美日韩调教| 成人av电影在线网| 亚洲影视在线播放| 欧美日韩一区二区三区在线免费观看 | 亚洲欧美日本伦理| 欧美男女交配| 日韩高清在线| 先锋影音亚洲资源| 91精品国产综合久久久久久久| 亚洲一区二区三区在线播放| ●精品国产综合乱码久久久久| 国产人久久人人人人爽| 一区二区三区不卡在线观看 | 日韩伦理片在线观看| 8x8ⅹ国产精品一区二区二区| 999国产在线| 欧美三级电影在线播放| 久久99影院| 欧美 日韩精品| 77thz桃花论族在线观看| 美女久久久久| 久久99精品国产麻豆婷婷洗澡| 亚洲一区二区成人在线观看| 亚洲欧洲在线观看| 久热精品在线视频| 精品一区二区久久久久久久网站| 免费看国产一级片| 欧美69xxxx| 亚洲97av| 日韩午夜在线| 成人国产一区二区三区精品| 在线亚洲人成电影网站色www| 国内精品久久影院| 99伊人久久| 极品白浆推特女神在线观看| 97超碰资源站在线观看| 久久高清免费| 久久精品水蜜桃av综合天堂| 精品视频1区2区| 国产精品精品视频一区二区三区| 国产精品jizz在线观看老狼| 精品国产白色丝袜高跟鞋| 亚洲精选国产| 一区二区三区日韩欧美精品| 欧美国产中文字幕| 色噜噜狠狠永久免费| 欧美男人操女人视频| 欧美经典三级视频一区二区三区| 亚洲视频777| 欧美精品99久久| 欧美极品免费| 一本色道久久精品| 欧美色视频在线| 日韩男女性生活视频| 拔插拔插海外华人免费| 波多野结衣在线观看| 欧美久久成人| 午夜精品久久一牛影视| 欧洲亚洲免费视频| 人人在线97| 成人羞羞在线观看网站| 中文字幕日本不卡| 国产91精品在线播放| 黄色片av在线| 久久av免费| 日韩av影视在线| 日韩成人影院| 欧美在线视频全部完| 欧美色精品在线视频| 色综合久久精品亚洲国产 | 亚洲美女又黄又爽在线观看| 国产精品久久久久久亚洲影视| 亚洲一二区在线| 欧美亚洲免费在线| www.欧美日本| 精品中文视频| 精品一区二区三区在线视频| 亚洲不卡在线观看| 午夜精品久久久久久久99热浪潮| 一区二区三区三区在线| 国产精品久久久久久久久久久新郎 | 欧美午夜理伦三级在线观看| 中文字幕少妇一区二区三区| 欧美激情www| 99re在线视频播放| aaa日本高清在线播放免费观看| 777午夜精品电影免费看| 久久国产精品99久久久久久老狼| 亚洲国产成人精品电影| 先锋影音日韩| 欧美野外wwwxxx| 免费观看日韩电影| 北条麻妃一区二区三区中文字幕 | 日韩中文第一页| 日韩五码在线观看| 91国拍精品国产粉嫩亚洲一区| 韩国毛片一区二区三区| 亚洲精品动漫100p| 日本免费成人网| 国产日韩欧美中文在线| 久久久99精品免费观看不卡| 性欧美高清come| 郴州新闻综合频道在线直播| 91麻豆文化传媒在线观看| 国产精品视频播放| 国产小视频免费在线网址| 日韩久久综合| 久久综合久色欧美综合狠狠| 国产精品成人在线观看 | 日韩毛片视频在线看| 欧美在线视频导航| 日韩大胆视频| 青青草成人在线观看| 亚洲人成亚洲人成在线观看| 怡红院av亚洲一区二区三区h| 亚洲一区二区三区中文字幕在线观看 | 日韩二区三区在线| 日韩中文字幕av在线| 在线最新版中文在线| 18成人在线视频| 99c视频在线| 中文不卡1区2区3区| 亚洲欧美激情一区二区| 亚洲v国产v在线观看| 做爰高潮hd色即是空| 久久亚洲免费| 91免费在线| 欧美精品入口| 精品偷拍各种wc美女嘘嘘| 国产精品视频网站在线观看 | 不卡的国产精品| 中文字幕精品在线不卡| 国产精品久久久久久久天堂| 欧美人与禽性xxxxx杂性| www.视频一区| 国产精品色悠悠| 咪咪网在线视频| 黑人巨大精品欧美一区二区一视频 | 午夜精品久久久99热福利| 久久国产情侣| 国产精品性做久久久久久| 亚洲一级二级在线| 国产精品中文字幕一区二区三区| 亚洲欧美另类自拍| 欧美人xxx| 欧美日韩在线影院| 欧美精品一区二区三区涩爱蜜| 国产天堂亚洲国产碰碰| 中文国产成人精品久久一| 精品成在人线av无码免费看| 日韩大片在线观看| 在线播放日韩导航| 国产区二区三区| 亚洲国产毛片aaaaa无费看| 日韩免费观看视频| 欧美男男tv网站在线播放| 蜜臂av日日欢夜夜爽一区| 欧美国产乱视频| 欧美伊人亚洲伊人色综合动图| 日本道免费精品一区二区三区| 中文一区一区三区免费在线观看| 成人av在线观| 国产在线网站| 写真福利片hd在线观看| 日本免费一区二区三区最新| 久久亚洲在线| youjizz在线播放| 精品久久久久久中文字幕| 国产精品17p| 国产欧亚日韩视频| 亚洲成人tv网| xxxxxx在线观看| 极品少妇一区二区三区精品视频| 青青青在线视频播放| 亚洲五月六月丁香激情| 大黄网站在线观看| 奇米4444一区二区三区| 影音先锋日韩在线| 亚洲欧美日韩在线综合| 26uuu色噜噜精品一区| 国产美女99p| 西瓜成人精品人成网站| 高清欧美电影在线| 婷婷激情图片久久| 日本一区二区三区视频在线观看 | 久久www视频| 国产乱码一区| 78色国产精品|