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

Spring事務的這十種坑,坑坑致命!

開發 后端
spring事務大多數情況下,可以滿足我們的業務需求。但是今天我要告訴大家的是,它有很多坑,稍不注意事務就會失效。

 

1.錯誤的訪問權限

@Service
public class UserService {
@Autowired
private UserMapper userMapper;
@Transactional
private void add(UserModel userModel) {
userMapper.insertUser(userModel);
}
}

我們可以看到add方法的訪問權限被定義成了private,這樣會導致事務失效,spring要求被代理方法必須是public的。

AbstractFallbackTransactionAttributeSource類的computeTransactionAttribute方法中有個判斷,如果目標方法不是public,則TransactionAttribute返回null,即不支持事務。

protected TransactionAttribute computeTransactionAttribute(Method method, @Nullable Class<?> targetClass) {
// Don't allow no-public methods as required.
if (allowPublicMethodsOnly() && !Modifier.isPublic(method.getModifiers())) {
return null;
}
// The method may be on an interface, but we need attributes from the target class.
// If the target class is null, the method will be unchanged.
Method specificMethod = AopUtils.getMostSpecificMethod(method, targetClass);
// First try is the method in the target class.
TransactionAttribute txAttr = findTransactionAttribute(specificMethod);
if (txAttr != null) {
return txAttr;
}
// Second try is the transaction attribute on the target class.
txAttr = findTransactionAttribute(specificMethod.getDeclaringClass());
if (txAttr != null && ClassUtils.isUserLevelMethod(method)) {
return txAttr;
}
if (specificMethod != method) {
// Fallback is to look at the original method.
txAttr = findTransactionAttribute(method);
if (txAttr != null) {
return txAttr;
}
// Last fallback is the class of the original method.
txAttr = findTransactionAttribute(method.getDeclaringClass());
if (txAttr != null && ClassUtils.isUserLevelMethod(method)) {
return txAttr;
}
}
return null;
}

2.方法被定義成final的

@Service
public class UserService {
@Autowired
private UserMapper userMapper;
@Transactional
public final void add(UserModel userModel) {
userMapper.insertUser(userModel);
}
}

我們可以看到add方法被定義成了final的,這樣會導致spring aop生成的代理對象不能復寫該方法,而讓事務失效。

3.方法內部調用

@Service
public class UserService {
@Autowired
private UserMapper userMapper;
@Transactional
public void add(UserModel userModel) {
userMapper.insertUser(userModel);
updateStatus(userModel);
}
@Transactional
public void updateStatus(UserModel userModel) {
// doSameThing();
}
}

我們看到在事務方法add中,直接調用事務方法updateStatus。從前面介紹的內容可以知道,updateStatus方法擁有事務的能力是因為spring aop生成代理了對象,但是這種方法直接調用了this對象的方法,所以updateStatus方法不會生成事務。

 4.當前實體沒有被spring管理

//@Service
public class UserService {
@Autowired
private UserMapper userMapper;
@Transactional
public void add(UserModel userModel) {
userMapper.insertUser(userModel);
}
}

我們可以看到UserService類沒有定義@Service注解,即沒有交給spring管理bean實例,所以它的add方法也不會生成事務。

 5.錯誤的spring事務傳播特性

@Service
public class UserService {
@Autowired
private UserMapper userMapper;
@Transactional(propagation = Propagation.NEVER)
public void add(UserModel userModel) {
userMapper.insertUser(userModel);
}
}

我們可以看到add方法的事務傳播特性定義成了Propagation.NEVER,這種類型的傳播特性不支持事務,如果有事務則會拋異常。只有這三種傳播特性才會創建新事務:PROPAGATION_REQUIRED,PROPAGATION_REQUIRES_NEW,PROPAGATION_NESTED。

6.數據庫不支持事務

msql8以前的版本數據庫引擎是支持myslam和innerdb的。我以前也用過,對應查多寫少的單表操作,可能會把表的數據庫引擎定義成myslam,這樣可以提升查詢效率。但是,要千萬記得一件事情,myslam只支持表鎖,并且不支持事務。所以,對這類表的寫入操作事務會失效。

7.自己吞掉了異常

@Slf4j
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
@Transactional
public void add(UserModel userModel) {
try {
userMapper.insertUser(userModel);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
}

這種情況下事務不會回滾,因為開發者自己捕獲了異常,又沒有拋出。事務的AOP無法捕獲異常,導致即使出現了異常,事務也不會回滾。

8.拋出的異常不正確

@Slf4j
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
@Transactional
public void add(UserModel userModel) throws Exception {
try {
userMapper.insertUser(userModel);
} catch (Exception e) {
log.error(e.getMessage(), e);
throw new Exception(e);
}
}
}

這種情況下,開發人員自己捕獲了異常,又拋出了異常:Exception,事務也不會回滾。因為spring事務,默認情況下只會回滾RuntimeException(運行時異常)和Error(錯誤),不會回滾Exception。

9.多線程調用

@Slf4j
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
@Autowired
private RoleService roleService;
@Transactional
public void add(UserModel userModel) throws Exception {
userMapper.insertUser(userModel);
new Thread(() -> {
roleService.doOtherThing();
}).start();
}
}
@Service
public class RoleService {
@Transactional
public void doOtherThing() {
System.out.println("保存role表數據");
}
}

我們可以看到事務方法add中,調用了事務方法doOtherThing,但是事務方法doOtherThing是在另外一個線程中調用的,這樣會導致兩個事務方法不在同一個線程中,獲取到的數據庫連接不一樣,從而是兩個不同的事務。如果想doOtherThing方法中拋了異常,add方法也回滾是不可能的。

如果看過spring事務源碼的朋友,可能會知道spring的事務是通過數據庫連接來實現的。當前線程中保存了一個map,key是數據源,value是數據庫連接。

private static final ThreadLocal<Map<Object, Object>> resources =
new NamedThreadLocal<>("Transactional resources");

我們說的同一個事務,其實是指同一個數據庫連接,只有擁有同一個數據庫連接才能同時提交和回滾。如果在不同的線程,拿到的數據庫連接肯定是不一樣的,所以是不同的事務。

10.嵌套事務多回滾了

public class UserService {
@Autowired
private UserMapper userMapper;
@Autowired
private RoleService roleService;
@Transactional
public void add(UserModel userModel) throws Exception {
userMapper.insertUser(userModel);
roleService.doOtherThing();
}
}
@Service
public class RoleService {
@Transactional(propagation = Propagation.NESTED)
public void doOtherThing() {
System.out.println("保存role表數據");
}
}

這種情況使用了嵌套的內部事務,原本是希望調用roleService.doOtherThing方法時,如果出現了異常,只回滾doOtherThing方法里的內容,不回滾 userMapper.insertUser里的內容,即回滾保存點。。但事實是,insertUser也回滾了。

why?

因為doOtherThing方法出現了異常,沒有手動捕獲,會繼續往上拋,到外層add方法的代理方法中捕獲了異常。所以,這種情況是直接回滾了整個事務,不只回滾單個保存點。

怎么樣才能只回滾保存點呢?

@Slf4j
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
@Autowired
private RoleService roleService;
@Transactional
public void add(UserModel userModel) throws Exception {
userMapper.insertUser(userModel);
try {
roleService.doOtherThing();
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
}

在代碼中手動把內部嵌套事務放在try/catch中,并且不繼續往拋異常。

介紹到這里,你會發現spring事務的坑還是挺多的~

責任編輯:龐桂玉 來源: Java后端技術
相關推薦

2018-04-02 07:32:15

2021-07-05 05:35:05

道路管理物聯網IOT

2025-09-08 00:00:01

2024-09-18 00:00:10

UUID識別碼標志符

2022-01-09 18:32:03

MySQL SQL 語句數據庫

2023-12-13 13:41:00

代碼Java程序員

2022-03-08 09:00:00

Kubernetes容器技術

2024-11-13 00:57:36

2015-10-26 09:38:23

程序員工作

2025-06-16 08:22:23

2019-06-24 15:30:23

編程程序員前景

2024-11-13 13:20:44

2023-05-15 15:29:13

設計模式JavaScript

2025-11-05 01:47:00

2024-01-22 08:15:42

API協議設計

2023-05-15 20:08:04

Linux字體

2020-08-13 07:00:00

工具技術管理

2010-08-30 16:18:05

2024-08-22 08:54:40

2010-09-13 17:17:04

點贊
收藏

51CTO技術棧公眾號

日本在线看片免费人成视1000| 精品无码m3u8在线观看| 国产91欧美| 亚洲免费观看高清完整版在线观看 | 日韩欧美中文字幕公布| 青青草原av在线播放| 女女色综合影院| 91毛片在线观看| 成人免费福利视频| 中文字幕精品三级久久久| 香蕉av一区二区| 精品在线欧美视频| 中文字幕无人区二| 久久亚洲精品人成综合网| 午夜激情久久久| 亚洲一区美女| 欧美zozo| www.66久久| 亚洲a级在线播放观看| 台湾佬中文在线| 激情综合久久| 久久艳片www.17c.com| 免费看黄色三级| 久久久免费毛片| 日韩欧美一区二区三区在线| 99热这里只有精品在线播放| 345成人影院| 亚洲福利视频三区| 国产精品一二三在线观看| a天堂中文在线| 久久久久久久电影| 蜜桃网站成人| 天堂在线一二区| 成a人片亚洲日本久久| 亚洲一区二区三区毛片| 自拍偷拍福利视频| 日韩精彩视频在线观看| 欧美一区二区大胆人体摄影专业网站| 18精品爽视频在线观看| 欧美在线二区| 久久综合电影一区| 国产67194| 欧美在线日韩| 欧美精品免费看| www.超碰在线观看| 欧美一区二区三区免费看| 久久精品小视频| 久久人妻无码aⅴ毛片a片app| 日韩精品永久网址| 综合国产在线视频| 婷婷社区五月天| 亚洲激情五月| 欧美激情免费看| 亚洲国产综合久久| 免费亚洲视频| 国产精品观看在线亚洲人成网| 免费看毛片网站| 日韩精品免费专区| 国产中文字幕91| 国产情侣在线播放| 成人综合在线网站| 国产综合 伊人色| 日本私人网站在线观看| 国产欧美一二三区| 中文字幕一区二区三区最新| 中文字幕资源网在线观看| 亚洲激情图片一区| 黄页网站大全在线观看| 欧美18—19sex性hd| 欧美在线观看18| 捷克做爰xxxⅹ性视频| 视频二区欧美| 97超碰资源站在线观看| 久久综合久久99| 天天综合狠狠精品| 超碰人人在线| 天天色天天操综合| 国产区二区三区| 免费看日产一区二区三区 | 日韩av成人在线| 亚洲一区在线观| 成人免费毛片app| 欧美大香线蕉线伊人久久| 岛国最新视频免费在线观看| 亚洲丝袜另类动漫二区| 欧美深夜福利视频| 日韩综合av| 亚洲国产精品999| 久久久久久国产免费a片| 伊人久久大香线蕉精品组织观看| 国内久久久精品| 中文文字幕一区二区三三| 国产成人小视频| 欧美日韩成人一区二区三区 | 国产成人免费av| 国产女人18毛片18精品| 久久久亚洲午夜电影| 青草全福视在线| 欧美日韩激情电影| 精品国产乱码久久久久久牛牛 | 亚洲精品欧美专区| 日韩 欧美 高清| 一区三区自拍| 色偷偷888欧美精品久久久| 日韩av一区二区在线播放| 日韩成人dvd| 国内一区二区三区在线视频| 97电影在线观看| 福利视频一区二区| 黄页网站在线看| 久久在线视频| 日韩美女在线观看一区| 国产成人三级在线观看视频| 国产精品久久毛片| 97公开免费视频| 美国成人xxx| 欧美极品美女视频网站在线观看免费| 午夜影院免费版| 中文字幕制服诱惑| 成人av网站在线观看免费| 亚洲人久久久| av在线一区不卡| 亚洲欧美中文日韩v在线观看| 九九热这里有精品视频| 老司机精品视频一区二区三区| 免费99视频| 日本不卡1234视频| 亚洲国产高潮在线观看| 免费人成年激情视频在线观看| 久久99热国产| 亚洲综合首页| 亚洲伦理网站| 色爱av美腿丝袜综合粉嫩av| 自拍偷拍色综合| 久久久久国产成人精品亚洲午夜| 女性女同性aⅴ免费观女性恋| 国产欧美三级电影| 欧美片一区二区三区| 国产a级免费视频| 亚洲黄色av一区| 久久发布国产伦子伦精品| 国产精品久久久久蜜臀| 成人黄在线观看| 国产在线观看av| 91精品国产综合久久精品| 自拍偷拍第9页| 精品一区二区在线看| 在线免费观看成人| 精品国产亚洲一区二区三区大结局| xvideos成人免费中文版| 国产又色又爽又黄又免费| 国产精品成人免费| 日本成人xxx| 欧美午夜不卡| 国产伦理一区二区三区| 大菠萝精品导航| 亚洲欧美三级伦理| 中文字幕在线观看高清| 中文字幕一区二区不卡| 国内精品国产三级国产aⅴ久| 午夜国产欧美理论在线播放 | 18涩涩午夜精品.www| 国产精品igao网网址不卡| 欧美日韩在线大尺度| 国产一区二区高清视频| 在线观看特色大片免费视频| 亚洲天堂av在线免费观看| 最新日本中文字幕| 好吊色在线观看| 亚洲精品成a人| 性久久久久久久久久久| 国产欧美亚洲一区| 视频在线99| 国产精品亚洲一区二区在线观看| 欧美美女操人视频| 日本韩国精品一区二区| 欧美理论电影在线| 国产成人一区二区三区影院在线| 国产午夜精品在线观看| 亚洲第一成肉网| 亚洲激情专区| 一本一道久久a久久精品综合 | 精品日韩一区二区三区| 亚洲 欧美 成人| 亚洲品质自拍视频| 波多野结衣一本| 国产一区啦啦啦在线观看| 青青青青草视频| 欧美3p视频| 精品一区二区日本| av在线播放一区二区| 欧美在线视频一二三| 毛片av在线| 日韩电影免费观看在线观看| 亚洲系列在线观看| 精品国产91久久久久久老师| 精品一区二区在线观看视频| 91香蕉视频mp4| 国产黑丝在线视频| 奇米四色…亚洲| 国内外成人激情视频| 在线一区免费| 一区精品在线| 久久av超碰| 精品国产综合| 成人av影音| 成人亚洲激情网| 91tv亚洲精品香蕉国产一区| 国内精品久久久久影院优| 黄色成人在线观看| 在线视频日本亚洲性| 五月婷在线视频| 日韩欧美成人午夜| 国产乱淫av免费| 欧美日韩另类国产亚洲欧美一级| 天天干天天干天天干天天| 亚洲综合久久久| 免费中文字幕日韩| 国产精品久久久久久亚洲毛片 | 狠狠入ady亚洲精品经典电影| 水蜜桃一区二区三区| 欧美日日夜夜| 精品乱码一区二区三区| 69精品国产久热在线观看| 成人信息集中地欧美| 欧美网站免费| 国产精品嫩草影院久久久| 在线天堂新版最新版在线8| 久久久久久久网站| 日本aa在线| 操91在线视频| 成人免费高清| 久久国产精品久久久久久久久久| 日韩精品毛片| 精品激情国产视频| 蜜桃av在线免费观看| 日韩中文在线中文网在线观看| 神马精品久久| 日韩精品中文字幕视频在线| 天天色棕合合合合合合合| 亚洲国产三级网| 六月婷婷综合网| 亚洲成色777777在线观看影院| www.午夜激情| 精品久久人人做人人爱| 免费成人在线看| 欧美第一区第二区| 日本高清视频免费观看| 精品国产青草久久久久福利| 免费看日韩av| 亚洲精品成人网| 美女毛片在线看| 一区二区三区国产视频| 伊人免费在线| 麻豆成人在线看| 黄色美女视频在线观看| 97精品国产97久久久久久免费| 欧美激情护士| 国产成人精品优优av| 日韩黄色三级在线观看| **亚洲第一综合导航网站| 亚洲精品福利| 欧美精品久久久| 欧美顶级大胆免费视频| av 日韩 人妻 黑人 综合 无码| 国产精品sm| 国产女大学生av| 男女激情视频一区| 人妻精油按摩bd高清中文字幕| 99在线精品观看| 91视频免费在观看| 一区二区三区不卡视频在线观看| 国产一级特黄aaa大片| 色婷婷亚洲精品| 国产精品无码在线播放| 日韩成人网免费视频| av在线二区| 欧美大片免费观看| 婷婷午夜社区一区| 亚洲综合中文字幕在线观看| 中文字幕剧情在线观看| 先锋影音久久| 三区视频在线观看| 99九九99九九九视频精品| 舐め犯し波多野结衣在线观看| 亚洲美女屁股眼交| 激情视频网站在线观看| 91麻豆精品国产91久久久 | 日韩亚洲欧美视频| 日韩激情中文字幕| 69xxx免费视频| 中文无字幕一区二区三区| 欧美极品视频在线观看| 色综合色综合色综合色综合色综合| 国产乱码精品一区二区| 亚洲欧美中文日韩在线v日本| 手机在线免费观看av| 国产成人一区二区三区小说| 一区二区亚洲视频| 一区二区三区偷拍| 久久xxxx精品视频| 亚洲婷婷在线观看| 综合久久国产九一剧情麻豆| 精品国产午夜福利| 亚洲韩国欧洲国产日产av| 黄色一级片在线观看| 日本国产精品视频| 精品淫伦v久久水蜜桃| 最新不卡av| 秋霞电影网一区二区| 国产福利在线观看视频| 亚洲精品成人a在线观看| 在线免费看91| 亚洲欧美制服中文字幕| 在线手机中文字幕| 国产免费一区二区三区| 欧美黄污视频| 制服丝袜中文字幕第一页| 国产午夜亚洲精品理论片色戒| 日韩三级一区二区三区| 精品国产污污免费网站入口 | 偷拍自拍在线视频| 久久久久亚洲精品成人网小说| 麻豆一区在线| 精品一区二区成人免费视频| 青娱乐精品在线视频| 公侵犯人妻一区二区三区| 午夜av区久久| 特黄视频在线观看| 久久人人爽人人| 动漫av一区| 人人妻人人做人人爽| 国产成人在线免费| 欧美人妻精品一区二区免费看| 欧美精品自拍偷拍| 黄色网址在线免费观看| 国产原创欧美精品| 国产精品久久久久久久| 五月天婷婷在线观看视频| 亚洲欧洲日韩在线| 国产一区二区小视频| 日韩视频一区在线| 国产精品1区| 久久香蕉视频网站| 日韩大片免费观看| 亚洲欧美精品一区二区| 黄色软件视频在线观看| 精品国产乱码久久久久久蜜柚| 亚洲精品美女| 在线观看日本中文字幕| 欧美视频中文一区二区三区在线观看 | 国产一级aa大片毛片| 精品国产乱码久久久久久牛牛| av在线加勒比| 蜜桃传媒视频第一区入口在线看| 日日欢夜夜爽一区| 无码人中文字幕| 91麻豆精品国产91久久久更新时间| www.欧美日本韩国| 韩国一区二区三区美女美女秀 | 99久久久久久中文字幕一区| 精品综合久久久久| 一区二区三区在线影院| 色丁香婷婷综合久久| 日本久久亚洲电影| 久久精品国产68国产精品亚洲| 韩国一区二区在线播放| 亚洲韩国精品一区| 免费福利在线视频| 成人h片在线播放免费网站| 久久一区二区三区电影| 无码人妻一区二区三区免费n鬼沢| 偷窥少妇高潮呻吟av久久免费| 女人偷人在线视频| 91亚洲精品在线观看| 在线亚洲国产精品网站| 精品一区二区三区蜜桃在线| 欧美一区日韩一区| 美脚恋feet久草欧美| 伊人色综合影院| 99精品国产91久久久久久| 亚洲高清视频免费观看| 久久99精品久久久久久琪琪| 女同久久另类99精品国产| 在线观看免费av网址| 午夜精品久久久久影视| 欧美被日视频| 精品综合久久| 国产精品影视天天线| 欧产日产国产69| 欧美日本高清一区| 凹凸成人精品亚洲精品密奴| 免费观看一区二区三区| 欧美综合天天夜夜久久| 国产白丝在线观看| 一区二区免费电影| 久久久一区二区三区捆绑**| 精品免费久久久| 国产美女搞久久| 男人天堂欧美日韩|