老師,我是江蘇的小伙伴,我遇到一個事務回滾的問題,不知道是不是我的數據庫版本問題
我先說下我的環(huán)境差異吧:springboot的版本是一樣的2.0
數據庫我的是mysql8.0
依賴是<dependency> ???<groupId>mysql</groupId> ???<artifactId>mysql-connector-java</artifactId> ???<version>8.0.11</version> </dependency>
我在service層用了@Transactional(propagation?=?Propagation.REQUIRED,isolation?=?Isolation.DEFAULT,timeout=36000,rollbackFor=Exception.class)
但是沒有生效我以為沒有開啟事務,還在啟動入口加了@EnableTransactionManagement
都沒有回滾
我最后在切面里改了點東西就可以了,我是這樣改的catch(Exception?e){ ???log.error("日志記錄發(fā)生錯誤,?errorMessage:?{}",?e.getMessage()); ???throw??e; }
然后發(fā)現事物就起作用了,不知道這樣改行不行,springboot的事務機制是不能通過切面攔截嗎?
希望老師解決下我的問題,謝謝啦~
2018-08-17
重點就在于你切面里面的throw e;應該@Transactional原理也是切面捕獲異常,如果你的切面在@Transactional之前將異常給捕獲了并且不拋出,那么事務就會失效。
你可以寫這么兩段代碼(以下為偽代碼)比較一下:
第一段代碼因為已經把異常捕獲了,不拋出,所以事務失效。
第二段代碼就可以成功。
由此問題可以得到一個開發(fā)規(guī)范就是,項目中必須要有自定義異常,在每一個try catch里面都必須拋出一個自定義異常
2018-06-16
1、只有在運行時異常時才支持回滾
2、數據庫引擎是InnoDB才支持事物