有时候在使用事务的时,做了事务嵌套,结果其中有一个抛出异常时,异常会一直连续跑出到最外层。
问题:明明捕获了异常为什么还会抛出。
@Transactional //第一层 会在方法执行完成后,在进行提交。此时代码已经失去了try-catch保护
public UserReply queryUser(UserQuery query)
{
BaseAccountExt user = null;
try
{
// 第二层。在此方法中也配置有事务,且抛出异常。它的异常会传递给当前方法
user = accountService.query(query.getAppCode());
}
catch(Exception ex) // 捕获异常
{
ex.printStackTrace();
}
System.out.println("-----------------------分割线-------------------------------");
return new UserReply(user);
}
? ?
@Transactional
public BaseAccountExt query(String name){
// 先更新数据
BaseAccount baseAccountExt = new BaseAccount();
baseAccountExt.setFullName("abcd");
baseAccountExt.setName(baseAccountExt.getName());
baseAccountService.update(baseAccountExt);
throw new RuntimeException("当前对象不为空!");
}
?
解决办法:网上可能有很多种说法,但是所有的方法都是一种规避.
@ExceptionHandler(value = { ApiException.class, BindException.class,
Exception.class })
protected ApiReply checkedException(Exception ex) {
ApiReply reply = new ApiReply(ApiReplyCode.FAILED);
if (ex instanceof TransactionException) {
reply = new ApiReply(ApiReplyCode.TRANSACTIONEXCEPTION);
}
logError(request, reply, ex);
return reply;
}
??
spring事务的[Transaction rolled back because it has been marked as rollback-only]浅析
原文:http://javaprimary.iteye.com/blog/2285874