1. 程式人生 > >一次想不到的Spring事務失效問題跟蹤(事務不會滾)

一次想不到的Spring事務失效問題跟蹤(事務不會滾)

spring srpingjdbc srpingtx

周末,鼓搗了下spring事務。spring事務配置其實很簡單,這是spring優點。但問題是,不知道其中原理,遇到點問題,就抓瞎了。我就犯傻了一次。

在追蹤問題時,搜索到的答案,主要有以下幾類。

  1. springmvc 上下文,與service上下文沖突

  2. 數據表不支持事務(mysql 中myisam)

  3. 異常類型,默認支持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事務失效問題跟蹤(事務不會滾)