解决方案 »
- struts2 FileOutputStream.read报错
- ---======求教:struts1.x 插入操作,产生重复ID======---
- Apache2.2.4+Tomcat6.0+Jdk1.6.0应用程序出错
- JSF Facelets 中的组件可以带有css或者js的东西么
- spring方法拦截 只要是给我讲明白我把分全给他,嫌少还可以再加.
- 讨论,关于LDAP
- EJB module的问题?
- POOL总是配不好,过来看一下
- 如何汉化JAVA包?
- 能不能帮我解释解释什么是EJB?
- 求 j2ee 的java.lang.NullPointerException问题快要发疯了
- MyEclipse整合SSH,做个登录,跪求大神
确定没进 catch里面去 直接逃过了
没看懂你的意思。 先查——判断——插入不是正常的么?
是的,一般的话 这个业务顺序是正常的,那为什么我在service的异常捕获不到,反而在我service的外层Controller层可以捕获到,这个不明白为什么
网上说 是spring把 SqlException 转换成了DataAccessException, 但是只能在service的外层可以捕获到 不知道为啥??请您看下:http://bbs.csdn.net/topics/390050093?page=1#post-398522654
这个是网上之前的一个论坛,也是说这个问题的 请您看下,可能是我没说清楚
其实我的这个方法就是在service层做的,只不过是调用了balanceSourceService里面的方法
try {
balanceSourceService.save(source);
}catch(DataAccessException e){
System.out.println("service=================================");
e.printStackTrace();
}
不过他执行到这里 就会直接逃过去,到上面的controller才报出异常 ,就行这里面说的 http://bbs.csdn.net/topics/390050093?page=1#post-398522654
其实我的这个方法就是在service层做的,只不过是调用了balanceSourceService里面的方法
try {
balanceSourceService.save(source);
}catch(DataAccessException e){
System.out.println("service=================================");
e.printStackTrace();
}
不过他执行到这里 就会直接逃过去,到上面的controller才报出异常 ,就行这里面说的 http://bbs.csdn.net/topics/390050093?page=1#post-398522654
你只是捕获DataAccessException类型的异常,他抛的不是这种的异常你当然捕获不到了,你改成catch(Exception e)
我使用注解在 service层的方法 上加@Transactional 做的的事务,这样在service事务还提交不了?我对spring的理解不够深,我以为把这个注解加在哪个方法上,事务就控制到这个层了呢
其实我的这个方法就是在service层做的,只不过是调用了balanceSourceService里面的方法
try {
balanceSourceService.save(source);
}catch(DataAccessException e){
System.out.println("service=================================");
e.printStackTrace();
}
不过他执行到这里 就会直接逃过去,到上面的controller才报出异常 ,就行这里面说的 http://bbs.csdn.net/topics/390050093?page=1#post-398522654
你只是捕获DataAccessException类型的异常,他抛的不是这种的异常你当然捕获不到了,你改成catch(Exception e)DataAccessException e这个异常是 spring把SqlException异常转化过来的,报错是唯一索引冲突,所以底层就是SqlException,但是Spring会把他转为DataAccessException 异常,我之前是写的 Exception的 效果是一样
楼主是service里面又调用了balanceSourceService.save是吧,那你这个service上是不是已经有事务了如果有,那么balanceSourceService.save上是不是也有事务标识,如果balanceSourceService.save上也有事务标识而调用balanceSourceService.save的service的方法上也有事务标识的话,那么这个事务事务的传播方式如果balanceSourceService.save不是Propagation.REQUIRES_NEW的话就会出现这个问题,因为不新开一个事务的话,两个都是用同一个事务,balanceSourceService.save方法运行完成了,是不会提交的,只有上层的service调用成功后才会提交的,而你这个索引的异常是要事务提交到数据库才会出现的,所以你才捕获不到,如果你balanceSourceService.save方法上的事务传播改为Propagation.REQUIRES_NEW的话就能捕获到了
楼主是service里面又调用了balanceSourceService.save是吧,那你这个service上是不是已经有事务了如果有,那么balanceSourceService.save上是不是也有事务标识,如果balanceSourceService.save上也有事务标识而调用balanceSourceService.save的service的方法上也有事务标识的话,那么这个事务事务的传播方式如果balanceSourceService.save不是Propagation.REQUIRES_NEW的话就会出现这个问题,因为不新开一个事务的话,两个都是用同一个事务,balanceSourceService.save方法运行完成了,是不会提交的,只有上层的service调用成功后才会提交的,而你这个索引的异常是要事务提交到数据库才会出现的,所以你才捕获不到,如果你balanceSourceService.save方法上的事务传播改为Propagation.REQUIRES_NEW的话就能捕获到了
您说的这个点我都没考虑到,确实是会出现这样的情况的 ,我在事务上的控制是在放在方法上的 ,没有在类上做事务的控制,目前是只有在service的那个方法上加的有事务如下所示: public class BalanceInterfaceImpl{
@Transactional
public void payFees(){
....
....
balanceSourceService.save(source);
}
}balanceSourceService.save(source)这是另外一个类中的方法,并且这个方法我没有去手动的在方法上加事务,您说这是几个事务,我理解的只有一个(对事务的原理理解的不是很好),请指点!!谢谢您了
楼主是service里面又调用了balanceSourceService.save是吧,那你这个service上是不是已经有事务了如果有,那么balanceSourceService.save上是不是也有事务标识,如果balanceSourceService.save上也有事务标识而调用balanceSourceService.save的service的方法上也有事务标识的话,那么这个事务事务的传播方式如果balanceSourceService.save不是Propagation.REQUIRES_NEW的话就会出现这个问题,因为不新开一个事务的话,两个都是用同一个事务,balanceSourceService.save方法运行完成了,是不会提交的,只有上层的service调用成功后才会提交的,而你这个索引的异常是要事务提交到数据库才会出现的,所以你才捕获不到,如果你balanceSourceService.save方法上的事务传播改为Propagation.REQUIRES_NEW的话就能捕获到了
额,我大概明白点了,但是问题会又出来了,假如我balanceSourceService.save使用REQUIRES_NEW这种事务传播方式,那么当balanceSourceService.save成功提交但是在上层的service方法中有异常了 需要回滚 此时我balanceSourceService.save的事务已提交是回滚不了的了
balanceSourceService.save(source);
}catch (Exception e) {
e.printStackTrace();
} 这段代码中 事物是在哪 在Service上还是在你这个方法这边?
如果你的事物没在save的时候提交 那么就不会报错
你那个错是事物提交的时候才报错的
如果你save没提交事物
你这里确实捕获不到异常吧