精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

事務篇:Spring事務的坑,你都踩過嗎?

數據庫 其他數據庫
日常中最容易出現事務失效或者不能按照預期執行的情況,大致分為四類:自身調用、異常被吃、異常拋出類型不對以及事務的傳播機制不熟悉。

本篇,我們將要從本人以及同事在工作中踩過的關于事務的坑,以及踩坑之后自己在發現的使用 Spring 事務存在的坑展示給大家,讓大家也避免踩坑

一、來看看這些事務之坑

總得來說呢,經常遇到的其實是這四類:自身調用、異常被吃、異常拋出類型不對以及事務的傳播機制不熟悉

具體例子,我們來看看:

1.數據庫引擎不支持事務

感覺這種一般估計不太會出現。畢竟你要使用事務,肯定會在最開始就選擇支持事務的數據庫引擎咯

比如常用的 oracle 直接就是支持事務的,而 mysql 的 innodb 支持事務,myIsam 的話,是不支持事務的

在 mysql5.1 版本之前,默認引擎是 myIsam ,而之后的版本則默認就是innodb 了~

建議檢查項:mysql的數據庫引擎。

執行命令:

show variables like '%storage_engine%';

我們看到,我本地的 5.7 版本 的 mysql 數據庫的數據庫引擎默認就是 innodb

2.方法不是 public 的

其實經過本人的測試,除了 private 方法本身就不能編譯通過以外,public、protected 以及 default 三個修飾符都是支持事務的

有興趣,你也可以測試一下!

3.自身調用問題

比如在同一個類中的兩個方法 methodA 和 methodB 。methodA 沒有設置事務,methodB 設置了事務,methodA 調用 methodB 時,事務便會失效

1) 同一個類中的方法調用

/**
* 自調用測試:事務失效,表中新增了兩條數據:id為10和11的數據
*/
@Override
public void testInvokeBInOneClass(){
User user = User.builder().id(10).name("王二").age(22).build();
userDao.addUser(user);
testB();
}

@Transactional
public void testB(){
User user = User.builder().id(11).name("張三").age(22).build();
userDao.addUser(user);
int i = 1/0;
}

我們預測一下:

若事務失效,數據庫中將會成功增加兩條數據:王二和張三

若事務生效,則表中將不會增加任何數據

執行該方法后,我們會發現,數據庫的 t_user2 表中的記錄為:

沒錯,結果,事務失效了

2)不同類中的方法調用

我們把 testB () 方法放到另一個類 TransactionBImpl 中

此時,調用 TransactionBImpl 類中的 testB () 方法;

/**
* 自調用測試:事務生效,表中新增了一條數據:id為10的數據
*/
@Override
public void testInvokeBInTwoClass(){
User user = User.builder().id(10).name("王二").age(22).build();
userDao.addUser(user);
transactionB.testB();
}

發現數據庫中的數據為:

說明事務生效了,為什么呢?

因為外層 testInvokeBInTwoClass() 方法本身是沒有事務(沒有加事務注解)的,它調用了另一個類中 加了事務注解的 testB() 方法,不要忘記 @Transactional 注解的默認傳播機制,是PROPAGATION_REQUIRED - 若不存在事務,就要自己創建一個新事務

也就是說,最終的效果就是,testB() 方法內部在一個事務內,testInvokeBInTwoClass()方法中,并沒有事務(不會因為異常而觸發回滾操作)

那么,最終的結果,也就輕易理解咯~

如果你聽過獨立事務的話,就能想到它的實現機制了吧!

Tips

有些業務需要,要求 methodA 調用 methodB 時,并不會因為 methodB 的執行失敗,而影響了調用之前的操作。如在在表中調用之前登記了一條狀態日志,此時并不想要因為調用失敗,而回滾了這條記錄,就可以這樣操作啦~

小結

事務在發生自調用時,若調用方沒有加 @Transactional 注解,事務便會失效

若要使事務生效,則可以考慮將該被調用的方法放在另一個類中即可

4.不支持事務

這種情況比較容易理解,只是會在編碼過程中容易被忽略掉,所以在這里也提一下

當 methodA 調用另一個類中的 methodB ,若 methodB 設置了事務的傳播機制為Propagation.NOT_SUPPORTED

那么,即使 methodA 開啟了事務,也不一定會按照自己的預期來發展的,來看看下面這個例子:

UserServiceImpl 類

 @Override
public void testNotSupported() {
User user = User.builder().id(10).name("王二").age(22).build();
userDao.addUser(user);
transactionB.testNotSupported();
}

TransactionBImpl 類

@Transactional
(propagation = Propagation.NOT_SUPPORTED)
@Override
public void testNotSupported(){
User user = User.builder().id(11).name("張三").age(22).build();
userDao.addUser(user);
int i = 1/0;
}

即,UserServiceImpl 類中的 testNotSupported()方法調用了 TransactionBImpl 類 中的 testNotSupported()方法

我們來分析一下,按照調用方是否開啟事務,可以分為以下兩種情況 :

1)若調用方 testNotSupported()方法不加 @Transactional 注解,則表中數據為:

顯而易見,說明兩個方法統一都沒有事務

若加上,則只插入了一條數據

說明外部方法還是存在事務的,只要出現異常就會回滾。而被調用方 transactionB.testNotSupported() 的方法內部不支持事務,于是該方法出錯之后也不會出現事務回滾,因此出錯之前的插表操作就沒有回滾

5.異常被catch住了,沒有拋出來

由于事務默認回滾的是:RuntimeException 和 Error 兩種情況,所以以下兩種情況都會失效

1)異常被吃了,事務失效

/**
* 7、異常被吃了:try掉異常(未拋出),事務失效
*/
@Transactional
@Override
public void testException(){
try {
User user = User.builder().id(10).name("王二").age(22).build();
userDao.addUser(user);
int i = 1/0;
}catch (Exception e) {
System.out.println("執行失敗:"+e.getMessage());
// throw new RuntimeException("執行失敗,拋出異常:"+e.getMessage());
}
}

也就是說,異常并沒有被拋出來,而是通過 catch 住,然后做了一些其他的邏輯處理,這種事務是不會生效的

再來看看第二種情況

2)拋出Exception異常,事務失效

@Transactional
@Override
public void testException() throws Exception {
try {
User user = User.builder().id(10).name("王二").age(22).build();
userDao.addUser(user);
int i = 1/0;
}catch (Exception e) {
System.out.println("執行失敗:"+e.getMessage());
throw new Exception("拋出了Exception異常:"+e.getMessage());
// throw new RuntimeException("執行失敗,拋出異常:"+e.getMessage());
}
}

回想一下我們的大前提:Spring事務默認回滾的是:RuntimeException和Error兩種情況。現在拋出了 Excption ,就不會觸發事務的回滾,所以這樣事務也是不生效的

要怎樣才能讓這樣的事務生效呢?

改成拋出 RuntimeException 事務就生效啦~ 你完全可以現在就試試

對了,如果你想觸發其他異常的回滾,包括你自己定義的異常或者 Exception 異常的話,也不是沒有辦法。只需要在方法的注解上配置一下 rollbackFor 屬性即可,如:@Transactional(rollbackFor = Exception.class)。

留一個思考題給你:若配置了其他異常,那原本的規則是否被覆蓋掉?

小結

只要抓住一點:事務默認在:RuntimeException 和 Error 兩種情況下執行回滾操作

因此,

1)異常被捕獲掉,沒有拋出來,就不會生效

2)拋出的 RuntimeException 異常或者未遇到 Error ,事務默認也不會生效的

那么,怎么處理才能讓事務生效,想必已經很明顯了吧?

6.未啟用spring事務管理功能

@EnableTransactionManagement 注解用來啟用spring事務自動管理事務的功能,只有有這個注解,這個注解千萬不要忘記寫了

但是當引入了;

spring-boot-starter-jdbc

就可以不用我們自己寫,為什么呢?我們來看看;

@EnableTransactionManagement 這個注解開啟事務,其實和我們自己使用@EnableTransactionManagement是一樣的 因此,只要我們在 SpringBoot 中引入了 spring-boot-starter-jdbc 這個依賴以后,我們就只需要使用 @Transactional 就可以了。

二、總而言之

好了,本篇文章,接著上一篇的事務基礎,為大家演示了幾個開發過程中容易出現的事務失效,或者事務不能按照自己的預期來執行的幾種場景。

總結一下,日常中最容易出現事務失效或者不能按照預期執行的情況,大致分為四類:自身調用、異常被吃、異常拋出類型不對以及事務的傳播機制不熟悉。

那么我們需要如何去避免踩坑,正確高效地使用事務呢?

很簡單,只需要關注單個方法時事務的回滾機制,以及涉及到兩個以及兩個以上方法的調用時事務的傳播機制以及Spring事務的原理。

  • 單個方法的調用,事務只會在執行過程中出現 RuntimeException 和 Error 以及事務超時時進行事務的回滾;
  • 多個方法:當在同一個類中進行方法調用時,若要事務不失效,則需要在調用方的方法都加上事務注解,同時需要關注事務的傳播機制以及各層方法的事務回滾情況;

不在同一類中時,則需要根據特定的業務場景,選擇不同的傳播機制。

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2025-02-10 00:27:54

2024-04-01 08:05:27

Go開發Java

2023-03-13 13:36:00

Go擴容切片

2019-09-25 15:30:15

2025-05-27 08:45:00

2019-10-30 14:44:41

Prometheus開源監控系統

2018-09-11 09:14:52

面試公司缺點

2025-04-29 10:17:42

2025-10-15 02:45:00

系統分表接口

2017-07-17 15:46:20

Oracle并行機制

2023-08-29 10:51:44

2023-09-08 08:52:12

Spring注解事務

2025-07-08 09:09:32

MySQL類型

2022-07-06 11:47:27

JAVAfor循環

2025-04-14 09:31:03

2025-08-26 01:20:00

2019-12-12 14:32:26

SQL語句數據庫

2025-06-03 06:30:05

2025-02-06 07:45:44

2018-01-10 13:40:03

數據庫MySQL表設計
點贊
收藏

51CTO技術棧公眾號

日本h片久久| 国产99对白在线播放| 天天干天天舔天天射| 亚洲日本黄色| 亚洲一区二区久久| 中文字幕精品在线播放| 国产成人精品白浆久久69| 国产真实久久| 亚洲天堂av高清| 国产永久免费网站| 国产理论在线| 国产精品美女久久久久av爽李琼 | 国产一区二区在线观看视频| 久久久久久国产精品| 成人性生交大免费看| av免费在线免费观看| 不卡电影一区二区三区| 国产精品久久久久久久久男| 在线免费观看亚洲视频| 色综合久久中文| 亚洲一区二区美女| 欧美最大成人综合网| 国产成a人亚洲精v品无码| 久久久噜噜噜| 国内精品久久久久久久久| 正在播放国产对白害羞| 成人香蕉视频| 亚洲精品伦理在线| 水蜜桃亚洲一二三四在线| 丰满人妻一区二区三区免费视频| 美女脱光内衣内裤视频久久影院| 亚洲欧美制服第一页| 巨乳女教师的诱惑| 成人免费在线观看视频| 精品国产91久久久| 国产精品区二区三区日本| 国内av在线播放| av不卡在线| 欧美国产亚洲精品久久久8v| 激情五月激情综合| 另类一区二区三区| 亚洲欧洲三级电影| 欧美精品一区二区三区在线四季| www.黄色片| 精品一区二区三区欧美| 国产精品第8页| 欧美三日本三级少妇99| 亚洲无吗在线| 欧美黑人视频一区| 国产女人18水真多毛片18精品 | 亚洲精品中文字幕在线| 天码人妻一区二区三区在线看| 欧美午夜电影在线观看| 久久久99久久精品女同性| 在线观看亚洲大片短视频| 免费在线成人激情电影| 欧美视频一二三| 少妇高潮毛片色欲ava片| 欧美黑人猛交| 亚洲国产精品尤物yw在线观看| 樱空桃在线播放| 老司机99精品99| 日韩码欧中文字| 免费国产成人看片在线| www.欧美日本韩国| 亚洲精品中文在线| 大荫蒂性生交片| 草美女在线观看| 亚洲mv在线观看| 日韩国产高清一区| 高清美女视频一区| 国产精品日产欧美久久久久| 在线观看日韩羞羞视频| www.欧美日本韩国| 亚洲一区二区影院| 欧美,日韩,国产在线| 秋霞伦理一区| 欧美在线观看视频一区二区| 日韩一区二区三区久久| 57pao成人永久免费| 91精品午夜视频| av天堂一区二区| 欧美日韩一区二区三区四区不卡| 欧美私模裸体表演在线观看| 精品999在线| 韩国三级成人在线| 亚洲精品720p| 日本一级免费视频| 国产精品精品国产一区二区| 久久久久久国产三级电影| 青青青国产在线| 麻豆精品蜜桃视频网站| 91福利视频导航| 青青青草原在线| 国产精品久久精品日日| 国产一区二区片| 国产精品迅雷| 日韩午夜在线观看| 人妻一区二区视频| 综合一区av| 欧日韩不卡在线视频| 国产精品视频一二区| 99精品欧美一区二区三区小说| 欧美日韩另类丝袜其他| 在线观看午夜av| 色狠狠色狠狠综合| 少妇献身老头系列| 欧美精品久久久久久| 欧美激情一级欧美精品| 国产情侣呻吟对白高潮| 国产91精品一区二区麻豆亚洲| 欧美国产视频在线观看| 香蕉成人app免费看片| 欧美综合亚洲图片综合区| 亚洲一二三四五| 成人精品视频| 97人人做人人爱| 国产精品羞羞答答在线| 久久久99精品免费观看| 九九九九九九精品| 欧洲日本在线| 国产精品入口麻豆九色| 国产免费毛卡片| 久久天堂久久| 日日噜噜噜夜夜爽亚洲精品| 农村老熟妇乱子伦视频| 99精品免费视频| 亚洲一区二区三区乱码aⅴ蜜桃女| 人成在线免费视频| 亚洲国产cao| 又黄又爽又色的视频| 久久视频精品| 国产精品久久久久久影视| 天堂在线中文网| 一区二区三区四区视频精品免费| 香蕉视频禁止18| 亚洲婷婷影院| 2019日本中文字幕| 黄色aaa大片| 尤物在线观看一区| 丰满人妻一区二区三区大胸| 天天综合精品| 国产精品自产拍在线观| 国产精品四虎| 91国产成人在线| 中文字幕免费视频| aa亚洲婷婷| 久久精品美女| 黑人巨大精品| 亚洲视频在线播放| 老熟妇一区二区三区| 久久精品综合网| 成人三级视频在线播放| 欧美一区二区三区婷婷| 一区二区三区黄色| 啪啪小视频网站| 国产女人18毛片水真多成人如厕| 午夜视频在线瓜伦| 精品久久美女| 国产美女精品视频免费观看| 色综合久久久久综合一本到桃花网| 91久久香蕉国产日韩欧美9色| 无码一区二区三区在线| 日韩在线卡一卡二| 亚洲欧美日韩综合一区| 亚洲国产aⅴ精品一区二区三区| 最新的欧美黄色| 国产亲伦免费视频播放| 一区二区在线免费观看| 亚洲欧美日韩色| 亚洲一区欧美激情| 色一情一乱一伦一区二区三欧美| 色豆豆成人网| 日韩在线欧美在线| www日本视频| 欧美日韩国产色视频| 国产精品扒开腿做爽爽| 日韩avvvv在线播放| 国产精品乱码视频| 色一区二区三区| 亚洲最新在线视频| 国产女18毛片多18精品| 亚洲一区二区美女| 成人免费毛片糖心| 国内一区二区视频| 91丨porny丨探花| 国产精品亚洲片在线播放| 欧美另类在线观看| 少妇精品高潮欲妇又嫩中文字幕| 精品国产鲁一鲁一区二区张丽 | 日韩成人一级| 国产精品视频精品视频| 日韩欧美一起| 亚洲视频在线看| 精品久久久久久亚洲综合网站| 亚洲va欧美va人人爽| 欧美成人短视频| 成人国产精品视频| 中文字幕网av| 日韩视频三区| 四虎永久免费网站| 精品在线观看入口| 99电影在线观看| 最新日韩三级| 欧美激情区在线播放| 国产三级在线观看| 欧美精品一区二区精品网| 熟女少妇a性色生活片毛片| 成人看片黄a免费看在线| 宅男av一区二区三区| 国产色噜噜噜91在线精品 | 亚洲天堂自拍偷拍| 精品久久久久久亚洲精品| 国产大屁股喷水视频在线观看| 成人午夜在线免费| а 天堂 在线| 久久中文欧美| 欧美黑人经典片免费观看| 久久久久美女| 欧美日韩精品久久久免费观看| 亚洲2区在线| 国产精品吴梦梦| 亚洲淫成人影院| 久久男人的天堂| 2024短剧网剧在线观看| 色综久久综合桃花网| 日本v片在线免费观看| 欧美精品一区二区蜜臀亚洲| 国产美女三级无套内谢| 欧美在线免费视屏| 天天操天天爽天天干| 亚洲黄网站在线观看| 极品色av影院| 国产精品第五页| 永久免费av无码网站性色av| 91一区二区在线观看| 久久久久久久穴| 国产福利一区二区三区视频| www.色欧美| 色一区二区三区四区| 欧美精品一区二区三区久久| 日韩aaa久久蜜桃av| 国产精品免费在线播放| 欧美午夜在线播放| 91亚洲国产成人精品性色| 亚洲伦理一区二区| 成人午夜小视频| 久久av日韩| 91精品久久久久久久久久另类 | 国产一级伦理片| 国产aⅴ精品一区二区三区色成熟| 午夜啪啪小视频| 极品少妇xxxx精品少妇| 九九热精品国产| 国产真实精品久久二三区| 亚洲网中文字幕| 国产精品99久久久久久似苏梦涵| 在线观看视频你懂得| 国产精品1区2区3区| 精品人妻二区中文字幕| 国产成人av电影免费在线观看| 成人三级做爰av| 国产91高潮流白浆在线麻豆 | 久久亚洲黄色| 精品日产一区2区三区黄免费| 日本午夜精品| 日韩欧美一区二区三区四区| 成人羞羞在线观看网站| 日本福利视频导航| 欧美69视频| 男人的天堂狠狠干| 亚洲欧美日本日韩| 国产裸体舞一区二区三区| 免费视频一区二区| 亚洲成人手机在线观看| 成人性生交大片免费看中文 | 69国产精品成人在线播放| 中文不卡1区2区3区| 在线日韩av观看| 蜜桃视频在线观看免费视频网站www| 久久精品夜夜夜夜夜久久| 日本色护士高潮视频在线观看| 国内久久久精品| 电影一区二区| 91成人免费在线观看| 欧美日韩夜夜| 中文字幕制服丝袜在线| 在线观看视频免费一区二区三区| 精品久久久久久无码国产| 国产毛片精品国产一区二区三区| 日韩Av无码精品| 中文字幕av一区二区三区高| 免费在线视频一区二区| 黑人巨大精品欧美一区免费视频| 中文字幕在线观看国产| 精品久久久久久久人人人人传媒| 免费在线黄色影片| 久热爱精品视频线路一| 亚洲淫成人影院| 97在线中文字幕| 国产精品密蕾丝视频下载| 欧美黄色免费网址| 日韩国产成人精品| 日韩黄色一区二区| 国产女人水真多18毛片18精品视频| 久草成人在线视频| 在线免费观看成人短视频| 亚洲第一黄色片| 日韩中文字幕在线播放| 黑森林国产精品av| 91亚洲一区精品| 欧美美乳视频| 精品少妇在线视频| 国精产品一区一区三区mba视频| 特级西西人体wwwww| 一区二区三区高清| 一级黄色片免费看| 亚洲人成绝费网站色www| 激情av在线| 91日本在线观看| 成人羞羞视频播放网站| 成人综合视频在线| 成人免费福利片| 国产三级国产精品国产国在线观看| 91高清视频在线| 欧美拍拍视频| 欧美亚洲国产视频小说| 盗摄牛牛av影视一区二区| 国产女人18毛片| 久久精品国产亚洲a| 成年人免费观看视频网站| 午夜欧美2019年伦理 | 日韩大片在线观看视频| 色女人在线视频| 2014亚洲精品| 欧美1区2区3区| 国模大尺度视频| 一区二区三区.www| 亚洲av无码片一区二区三区| 欧美成人精品一区二区| 中文字幕中文字幕在线十八区 | 国产精品久久久久影院| 成人午夜精品视频| 国产亚洲精品一区二区| 亚洲第一二三四区| 日本视频精品一区| 久久一区视频| 国产又粗又猛又爽又黄av| 日本二三区不卡| fc2在线中文字幕| 国产精品偷伦一区二区| 99视频精品视频高清免费| 视频免费1区二区三区| 亚洲视频在线一区观看| 99在线小视频| 欧美高清自拍一区| www国产精品| 欧美 日韩 国产在线观看| 久久伊人中文字幕| 日本中文字幕在线观看视频| 国产一区二区三区四区福利| 国产精品高潮久久| 在线亚洲美日韩| 懂色av中文字幕一区二区三区| 日本中文字幕网| 亚洲精品小视频| 99只有精品| 欧美做暖暖视频| 99re66热这里只有精品3直播| 亚洲GV成人无码久久精品| 亚洲桃花岛网站| 亚洲精品毛片| 欧美乱做爰xxxⅹ久久久| 91香蕉视频mp4| 亚洲波多野结衣| 欧美mv日韩mv亚洲| 亚洲欧美电影| 一区二区国产日产| 国产 欧美在线| 无码人妻av一区二区三区波多野| 中文字幕欧美国内| 日韩中文字幕一区二区高清99| 免费看国产曰批40分钟| 国产精品沙发午睡系列990531| 精品人妻一区二区三区三区四区| 亚洲91av视频| 97精品视频| 亚洲激情 欧美| 欧美日韩另类国产亚洲欧美一级| 性直播体位视频在线观看| 看高清中日韩色视频| 激情欧美一区二区三区在线观看| 日韩久久久久久久久| 中文字幕精品www乱入免费视频| 97久久精品| 久久久精品麻豆| 国产亚洲欧美在线| a毛片在线免费观看| 欧美在线视频观看| 欧美成人有码|