精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

日韩免费毛片视频| 欧美一区二区三区在线播放| 精品无码m3u8在线观看| 综合亚洲色图| 欧美美女一区二区在线观看| avav在线播放| 男人天堂网在线| 老色鬼精品视频在线观看播放| 欧美乱大交xxxxx| 亚洲熟妇一区二区三区| 91精品一区| 国产综合色精品一区二区三区| 欧美成年人视频网站欧美| 亚洲观看黄色网| 中文成人在线| 色综合天天狠狠| 路边理发店露脸熟妇泻火| 青梅竹马是消防员在线| 精品亚洲国产成人av制服丝袜| 午夜精品福利视频| 精品亚洲乱码一区二区| 亚洲精品亚洲人成在线观看| 欧美一区二区高清| 性欧美大战久久久久久久免费观看 | 成人搞黄视频| 欧美高清视频一二三区 | 精品一区二区免费| 欧美在线一级视频| 国产成人精品亚洲男人的天堂| 久久国产精品亚洲人一区二区三区 | 欧美在线看片| 欧美疯狂性受xxxxx喷水图片| 日本福利视频一区| 国产激情在线| 国产精品成人免费在线| 日本高清不卡三区| 青春有你2免费观看完整版在线播放高清| 国产福利91精品| 国产一区二区在线免费| 欧美成人久久久免费播放| 亚洲动漫精品| 日韩av在线天堂网| 精品人妻一区二区免费| 9999精品免费视频| 欧美日韩国产高清一区二区三区| 成人羞羞国产免费网站| 国产白浆在线免费观看| 亚洲老司机在线| 只有这里有精品| 麻豆影视在线观看_| 欧美激情中文不卡| 亚洲精品欧美日韩专区| 又骚又黄的视频| 久久久久久网| 久久精品国产69国产精品亚洲| 国产女主播喷水高潮网红在线| 六月丁香久久丫| 亚洲精品第一国产综合精品| 中文视频在线观看| 欧美精品中文| 日韩极品精品视频免费观看| 一本色道综合久久欧美日韩精品| 久久精品亚洲成在人线av网址| 亚洲精品一区二区三区四区高清| 国产av无码专区亚洲精品| 日本黄色免费在线| 欧美午夜片欧美片在线观看| 日韩av在线综合| 青青热久免费精品视频在线18| 亚洲色图在线看| 青青草影院在线观看| 中文字幕有码在线观看| 一区二区三区在线免费观看| 成人国产在线看| 俺来俺也去www色在线观看| 亚洲国产成人91porn| 国产黄色片免费在线观看| 日本三级一区| 欧美丝袜丝交足nylons| 黄色三级视频在线播放| www.丝袜精品| 亚洲天堂色网站| 黄色片网站在线播放| 伊人久久大香线蕉精品组织观看| 久久久久女教师免费一区| 草久视频在线观看| 老司机免费视频一区二区三区| 91在线视频一区| 日韩在线视频第一页| 国产日韩欧美在线一区| 男插女免费视频| 天堂8中文在线最新版在线| 欧美亚洲禁片免费| 亚洲热在线视频| 宅男在线一区| 久久在线免费视频| 国产日产精品一区二区三区| 国产精品黄色| 国产aⅴ夜夜欢一区二区三区| 亚洲一卡二卡在线| 成a人片亚洲日本久久| 视频一区国产精品| 怡红院av在线| 欧美性一区二区| 中文字幕人妻熟女在线| 精品久久不卡| 欧美激情一区二区三区久久久| 天干夜夜爽爽日日日日| 国产做a爰片久久毛片| 美日韩免费视频| av片在线观看| 欧美亚洲自拍偷拍| 香港三日本8a三级少妇三级99| 欧美9999| 亚洲最新av在线| 精品在线视频免费| 久久精品国产精品亚洲红杏| 国产亚洲福利社区| 麻豆视频在线| 欧美这里有精品| 狠狠人妻久久久久久综合蜜桃| 国产在线观看一区二区| 亚洲精品一区二区在线| 国产精品密蕾丝袜| 国产高清亚洲| 亚洲美女性生活视频| 久久久精品视频免费观看| 天堂久久一区二区三区| 丁香婷婷久久久综合精品国产 | 久久久夜色精品| 美女mm1313爽爽久久久蜜臀| 国产一区二区三区四区五区在线| 精精国产xxxx视频在线| 在线观看不卡视频| 精品人妻一区二区三区香蕉| 国产精品多人| yellow视频在线观看一区二区| 日本免费在线观看| 欧美调教femdomvk| 成人一级片免费看| 天堂在线一区二区| 欧美大陆一区二区| 欧美特大特白屁股xxxx| 亚洲激情小视频| 日本一级淫片免费放| 国产91高潮流白浆在线麻豆| 一本二本三本亚洲码| 四虎影视成人精品国库在线观看| 国产亚洲精品美女久久久| 免费污污视频在线观看| 久久精品一本| 久久久久欧美| 成人私拍视频| 亚洲视频在线观看视频| 99re国产在线| 日本一区二区三区四区| 天天插天天操天天射| 超碰成人久久| 91精品国产综合久久香蕉的用户体验| 国产精品久久久久一区二区国产 | 亚洲欧美日韩在线播放| 热久久久久久久久| 亚洲乱码在线| 91文字幕巨乱亚洲香蕉| 操喷在线视频| 亚洲精品99久久久久| 91丝袜一区二区三区| 国产亚洲欧美一区在线观看| 亚洲激情在线观看视频| 国产韩日影视精品| y111111国产精品久久婷婷| 美女的胸无遮挡在线观看| 国产婷婷色综合av蜜臀av | heyzo中文字幕在线| 亚洲精品美女久久久久| 69视频免费看| 亚洲欧洲无码一区二区三区| 国产在线播放观看| 亚洲第一福利社区| 国产免费亚洲高清| 日韩影视在线| 亚洲欧洲第一视频| 中文字幕在线观看1| 亚洲精品v日韩精品| 男男一级淫片免费播放| 日韩va亚洲va欧美va久久| 国产对白在线播放| 欧美理伦片在线播放| 国产精品男人爽免费视频1| 熟妇人妻av无码一区二区三区| 高跟丝袜欧美一区| 911国产在线| av电影在线观看不卡| 五月天亚洲视频| 亚洲网站在线| 亚洲国产精品一区二区第一页| 日本免费一区二区视频| 日本视频久久久| 影音先锋在线播放| 国产亚洲欧美日韩一区二区| 99在线精品视频免费观看软件| 欧美午夜精品久久久久久浪潮| 亚洲一级生活片| 久久久国产精品午夜一区ai换脸| 91欧美一区二区三区| 久久久久国产一区二区| 日韩精品一区二区在线视频| 成人黄色小视频| 国语精品中文字幕| 国产一区精品二区| 国产精品第8页| 成人在线视频成人| 精品人在线二区三区| 中文字幕一区二区免费| 天天综合天天综合色| 男男一级淫片免费播放| 久久成人久久爱| 日本精品www| 在线观看的日韩av| 国产高清一区二区三区| 99re久久| 理论片在线不卡免费观看| 国内三级在线观看| 亚洲精品乱码久久久久久金桔影视| 国产毛片毛片毛片毛片| 欧美私人免费视频| 黄色片中文字幕| 精品国产成人av| 日韩免费一二三区| 一区二区三区在线影院| 免费在线观看黄色小视频| 欧美国产乱子伦| 国内精品久久99人妻无码| 99久久婷婷国产综合精品电影| 国产乱叫456| 麻豆91在线看| 欧美精品性生活| 欧美96一区二区免费视频| 99久久久无码国产精品6| 一本不卡影院| 国产素人在线观看| 亚洲精选91| 黄色一级视频在线播放| 国模大胆一区二区三区| 欧美精品在欧美一区二区| 欧美激情视频一区二区三区在线播放| 亚洲精品二区| 久久精品高清| 亚洲一区三区| 亚洲激情中文| 久久国产一区二区| 久久亚州av| 明星裸体视频一区二区| 亚洲免费观看高清完整版在线观| 精品一区日韩成人| 九九热精品视频在线观看| 日本不卡高清视频一区| 欧美日韩一二三四| 中文字幕中文字幕在线中一区高清 | 成人h版在线观看| 四季av综合网站| 26uuu精品一区二区三区四区在线| 一起草在线视频| 国产欧美精品在线观看| 黄色片网站在线播放| 亚洲精品乱码久久久久| 国产精品suv一区二区| 欧美色视频日本版| 波多野结衣毛片| 538在线一区二区精品国产| 国产成人av免费看| 亚洲福利在线视频| 精品资源在线看| 日韩中文在线观看| 久久www人成免费看片中文| 17婷婷久久www| 日韩毛片免费视频一级特黄| 97se在线视频| 日韩超碰人人爽人人做人人添| 奇米影视首页 狠狠色丁香婷婷久久综合 | 国产成人精品影院| 欧美丰满少妇人妻精品| 国产精品视频一二三区| 在线免费日韩av| 精品久久久久久中文字幕大豆网| 黄色免费av网站| 91精品国产91热久久久做人人 | 国产xxxxx在线观看| 久久精品国产第一区二区三区 | 国产欧美一区二区精品秋霞影院| 呻吟揉丰满对白91乃国产区| 亚洲一区免费观看| 波多野结衣不卡| 精品国产在天天线2019| 激情福利在线| 欧美激情视频网址| 国内精品久久久久久野外| 国语自产在线不卡| 日本免费成人| 奇米精品在线| 亚洲日产国产精品| 岛国av免费在线| 久久综合视频网| 黄色一级片在线免费观看| 91久久免费观看| 人人妻人人澡人人爽精品日本| 色妞欧美日韩在线| 小早川怜子影音先锋在线观看| 91亚洲永久免费精品| 深夜福利久久| 免费观看国产精品视频| 国产在线精品免费| 亚洲av熟女国产一区二区性色| 亚洲妇女屁股眼交7| 97在线公开视频| 亚洲欧美日韩中文视频| 不卡av免费观看| 91在线精品观看| 91九色精品| 国产野外作爱视频播放| 91美女在线观看| 国产精品suv一区二区| 日韩一级在线观看| 日本中文字幕在线视频| 国产精品成人av性教育| 日韩最新在线| 精品国产一区三区| 国产99久久精品| 免费中文字幕在线| 911国产精品| 亚洲视频tv| 国产美女扒开尿口久久久| 国产精品一区高清| 黄色国产精品视频| 久久久精品免费网站| 91在线视频在线观看| 亚洲精品成a人在线观看| 草草在线观看| 国产日韩精品久久| 很黄很黄激情成人| 日本人妻一区二区三区| 99re6这里只有精品视频在线观看| 50一60岁老妇女毛片| 亚洲一线二线三线视频| www.色播.com| 欧美福利视频在线| 香蕉免费一区二区三区在线观看 | 国产日韩高清一区二区三区在线| 潘金莲一级淫片aaaaa| 艳妇臀荡乳欲伦亚洲一区| 亚洲黄色激情视频| 亚洲国产精品成人一区二区| 24小时免费看片在线观看| 国产日韩欧美一区二区| 国产欧美日韩一级| 人妻熟女aⅴ一区二区三区汇编| 色综合一区二区| 国产原创av在线| 国产美女精品免费电影| 国产精品久久久久久| 成年人性生活视频| 亚洲成人精品影院| 青青草视频在线观看| 国产91在线视频| 91麻豆精品国产91久久久平台 | 久久久青草青青国产亚洲免观| 超碰中文字幕在线| 一区二区av在线| 日本黄色成人| 黄色一级片在线看| 久久久久久综合| 在线观看免费观看在线| 久久国产精品偷| 久久人人爽人人爽人人片av不| 国产精品动漫网站| 亚洲人吸女人奶水| 四虎永久在线精品免费网址| 日韩av免费看网站| 91精品天堂福利在线观看 | 成人h动漫免费观看网站| 一女被多男玩喷潮视频| 中文幕一区二区三区久久蜜桃| 国产理论片在线观看| 国产69精品久久久久9999| 经典一区二区| 麻豆免费在线观看视频| 色嗨嗨av一区二区三区| 巨大荫蒂视频欧美另类大| 国产精品久久一区二区三区| 久久亚洲图片| 久艹视频在线观看| 亚洲香蕉av在线一区二区三区| 国产人与zoxxxx另类91| 国产二区视频在线播放| 国产精品国产精品国产专区不片 | 日本一区二区三区电影免费观看| 日本www在线播放| 成人免费一区二区三区视频| 香蕉av一区二区三区| 91夜夜揉人人捏人人添红杏|