1 主要处理思路
1.1 思路1
事物回滚,一般抛异常,可以自己手写一个异常,根据异常判断。事物还是按照 spring 的之前的逻辑。只是,手工抛特定的异常。这样你就可以捕获这个异常给前台用户。
1.2 思路2
方法捕获异常抛出即可,记得方法定义必须抛出异常,否则框架捕获不到,声明式事物不起作用。
1.3 总结
我认为上述思路在实现上是统一的。下面给出一个用伪代码描述的例子。
MyException:
public classMyException extends RuntimeException {
public MyException(){
}
}
Action中:
@Autowired
private XServicexService;
public String AddXmethod(){
try {
xService.addX (x); //将x存入数据库
} catch (MyException e) {
System.out.println("service层出异常了....");
//其它处理,例:加上需要在前端显示的提示信息。
}
}
xService中:
@Service
@Transactional(propagation=org.springframework.transaction.annotation.Propagation.REQUIRED)
public class XService{
@Autowired
private XDao xDao;
public void addX (X x)throws MyException {
xDao.addX(x);
//人为的创建出一个异常,测试回滚在action中可以被判断。
try {
int a =10/0;
} catch (Exceptione) {
//手工抛出,作用有两个,
//1、使用spring事务增强,对事务回滚。
//2、action中可以捕获该异常,并处理,例:在前端显示提示信息。
throw newMyException();
}
}
}
例子结果说明:
1、事务增强可以通过SpringAOP进行事务增强。
2、事务发生回滚时,Action可以“判断”事务发生了回滚,并处理。
2 参考文献
http://www.jb51.net/article/32246.htm (Spring事务管理只对出现运行期异常进行回滚改变默认方式)
http://www.cnblogs.com/0201zcr/p/5962578.html(spring 事务回滚)
http://blog.csdn.net/gaowenming/article/details/5214737 (spring AOP的异常拦截)
http://www.cnblogs.com/zhuawang/p/5954819.html (关于Spring事务回滚的问题)
https://www.oschina.net/question/697871_2182978 (spring的事务insert操作怎么判断是否执行成功了还是回滚了)
济南java技术交流群群主隐士的思路与百度用户mahl8007的思路。
网友评论