您的位置:首页 > 编程语言 > Java开发

一次想不到的Spring事务失效问题跟踪(事务不会滚)

2017-05-08 21:35 477 查看
周末,鼓捣了下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结构去掉。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring srpingjdbc srpingtx