自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

日常Bug排查-拋異常不回滾

開發(fā) 前端
最近有人反映java應(yīng)用操作數(shù)據(jù)庫的時(shí)候,拋異常不回滾。這還了得,不過筆者篤定肯定是用法的鍋,不然就全亂套了。所以筆者去Review他的代碼。

[[404090]]

 前言

日常Bug排查系列都是一些簡(jiǎn)單Bug排查,筆者將在這里介紹一些排查Bug的簡(jiǎn)單技巧,同時(shí)順便積累素材^_^。

Bug現(xiàn)場(chǎng)

最近有人反映java應(yīng)用操作數(shù)據(jù)庫的時(shí)候,拋異常不回滾。這還了得,不過筆者篤定肯定是用法的鍋,不然就全亂套了。所以筆者去Review他的代碼。

代碼片段

  1. @Transacion(value="x")  
  2. public void s1() throw MyException{  
  3.     update(1);  
  4.     throwBusinessException(); 
  5.     update(2);  

乍看上去沒啥問題。

思路

筆者用@Transaction注解也用了好幾年了,從來沒遇到過拋異常不回滾的情況??此挠梅ㄒ埠凸P者差不多呀?

然后筆者稍微思索了會(huì),發(fā)現(xiàn)我寫的代碼和出問題的這一段稍稍有些不一樣。我是這么寫的:

  1. @Transacion(value="transManager")  
  2. public void s1(){  
  3.     update(1);  
  4.     update(2);  

貌似我從來沒有在函數(shù)上加過throw MyException,難道是這段有問題?翻看MyException代碼,發(fā)現(xiàn)它僅僅繼承了Exception。

  1. class MyEception extends Exception { 

好像就這點(diǎn)不一樣。而筆者自定義的Exception基本繼承了RuntimeException的。

翻下Spring源碼

按照這個(gè)思路,筆者去翻了下Spring的源碼,看下它在聲明式事務(wù)中的處理邏輯到底是什么,于是翻到了這一段處理事務(wù)異常的代碼:

  1. TransactionAspectSupport.java 
  2. protected void completeTransactionAfterThrowing(TransactionInfo txInfo, Throwable ex) { 
  3.     if (txInfo.transactionAttribute.rollbackOn(ex)) { 
  4.     }else
  5.         // We don't roll back on this exception. 
  6.         // Will still roll back if TransactionStatus.isRollbackOnly() is true
  7.         // 在checkedException的時(shí)候,不會(huì)被rollBack,會(huì)commit!!! 
  8.     } 
  9. @Override 
  10. public boolean rollbackOn(Throwable ex) { 
  11.     return (ex instanceof RuntimeException || ex instanceof Error); 

看代碼邏輯就明白了,只有異常繼承RuntimeException或者Error的時(shí)候才會(huì)回滾!好了,讓業(yè)務(wù)開發(fā)改了下代碼,問題解決了。

總結(jié)

遇到問題時(shí),找到出問題代碼段和類似的正確代碼段的不同處,以此為切入,往往能抓住線索。

本文轉(zhuǎn)載自微信公眾號(hào)「解Bug之路」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系解Bug之路公眾號(hào)。

 

責(zé)任編輯:武曉燕 來源: 解Bug之路
相關(guān)推薦

2021-06-15 16:17:19

Commit報(bào)錯(cuò)事務(wù)

2021-06-04 11:33:50

消息技巧排查

2024-05-13 10:21:43

Bug排查TCP

2021-05-19 14:03:48

磁盤故障時(shí)

2021-05-20 10:02:50

系統(tǒng)Redis技巧

2022-09-25 22:12:07

事務(wù)SpringBoot

2022-12-28 08:17:19

異常處理code

2021-07-15 23:16:09

IO異常排查

2025-03-17 10:01:07

2022-09-24 13:21:34

Java服務(wù)異常

2024-08-29 08:54:35

2023-02-02 08:56:25

線程池線程submit

2011-12-21 11:18:59

Java

2021-03-01 08:16:44

Linux 內(nèi)核代碼

2020-11-18 10:16:52

數(shù)據(jù)庫回滾事務(wù)

2024-10-28 11:07:33

磁盤目錄文件

2025-02-05 14:28:19

2020-07-08 07:50:50

OOM虛擬機(jī)Java

2019-04-11 08:45:27

2018-11-26 08:49:42

CPU排查負(fù)載
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)