一次想不到的Spring事務失效問題跟蹤(事務不會滾)
阿新 • • 發佈:2017-05-09
spring srpingjdbc srpingtx
周末,鼓搗了下spring事務。spring事務配置其實很簡單,這是spring優點。但問題是,不知道其中原理,遇到點問題,就抓瞎了。我就犯傻了一次。
在追蹤問題時,搜索到的答案,主要有以下幾類。
springmvc 上下文,與service上下文沖突
數據表不支持事務(mysql 中myisam)
異常類型,默認支持RuntimeException,如果是其他異常則需要專門配置
我的問題,上面原因都不是。很遺憾。
@Transactional(isolation= Isolation.READ_COMMITTED, rollbackFor={Exception.class, RuntimeException.class}) public int saveBlog(Blog blog) { int blogId=0; try { blogId = this.blogDao.save(blog); Event event = new Event(); event.setEventDate(new Date()); String eventStr= MessageFormat.format("this is a event from blog {0}", blogId); event.setTitle(eventStr); if(blog.getTitle().contains("error")){ throw new Exception("模擬失敗情況,手動觸發異常"); } this.eventDao.save(event); } finally { return blogId; } }
我為了方便測試結果驗證,強制返回ID.使用了finally.
跟蹤日誌過程中,發現,異常信息不打印,被忽略了。非常奇怪。把finally去掉,就正常打印異常堆棧。
修復方式是很顯然把try finally結構去掉。
本文出自 “簡單” 博客,請務必保留此出處http://dba10g.blog.51cto.com/764602/1923434
一次想不到的Spring事務失效問題跟蹤(事務不會滾)