周末,鼓捣了下spring事务。spring事务配置其实很简单,这是spring优点。但问题是,不知道其中原理,遇到点问题,就抓瞎了。我就犯傻了一次。
在追踪问题时,搜索到的答案,主要有以下几类。
-
springmvc 上下文,与service上下文冲突
-
数据表不支持事务(mysql 中myisam)
-
异常类型,默认支持RuntimeException,如果是其他异常则需要专门配置
我的问题,上面原因都不是。很遗憾。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
@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结构去掉。
本文转自 randy_shandong 51CTO博客,原文链接:http://blog.51cto.com/dba10g/1923434,如需转载请自行联系原作者