关于PlatformTransactionManager.commit()抛出异常的问题

pywepe 2012-07-23 04:18:10
public void save(final User user) {
if (user == null) {
throw new NullPointerException("user");
}
try {
getTransactionTemplate().execute(new TransactionCallback<Object>() {

@Override
public Object doInTransaction(TransactionStatus tx) {
try {
getHibernateTemplate().save(user);
} catch (Exception e) {
// 代码不会执行到这里
// save不抛异常
log.error("保存User失败", e);
tx.setRollbackOnly();
}
return null;
}
});
} catch (Exception e) {
// 代码会执行这到里,是在PlatformTransactionManager.commit()方法抛出的异常
// 这是正常的行为吗?
// 在这里捕获异常的话,不能回滚.
log.error("保存User失败", e);
throw new RuntimeException(e);
}

}


测试时User的主键重复,即测试必须抛出异常的情况.

请看注释
应该在HibernateTemplate.save()方法抛的出异常,推迟到了commit()方法

Spring 3.1.2
Hibernate 3.6.9
数据库用的是SQLServer2005
...全文
439 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
brightyq 2012-07-23
  • 打赏
  • 举报
回复
save方法所在类没有TransactionStatus 对象status 吗?
有的话就就PlatformTransactionManager.rollback(status);
没有的话也应该配置,在spring中就注入进来。
pywepe 2012-07-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

你既然catch住的是Exception ,那你第一个try catch就没有意义了,可以删去,只用最后一个try catch 出现异常时回滚就可以了
[/Quote]

在外层都不知道怎么回滚
需要一个TransactionStatus参数
brightyq 2012-07-23
  • 打赏
  • 举报
回复
在外层的catch 中,加一个执行platformtransactionmanager的rollback回滚。
它默认应该是可以把doInTransaction的事务也一起回滚的。
di_wq 2012-07-23
  • 打赏
  • 举报
回复
你既然catch住的是Exception ,那你第一个try catch就没有意义了,可以删去,只用最后一个try catch 出现异常时回滚就可以了

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧