Spring Hibernate:@Transaction (REQUIRES_NEW) 未捕获异常
Spring Hibernate : @Transaction (REQUIRES_NEW) not catching exception
A.java
try{
for(i=1;i<=5;i++){
List<Integer> intList = new ArrayList();
bService.executeMethod(i,intList);
}
}catch(Exception e){
logger.error("exception occoured {}",e);
}
B.java
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void executeMethod(int i, List<Integer> intList){
try{
.......dostuff;
}catch(Exception e){
strList.add(i)
}
}
如果任何迭代的 executeMethod() 出现问题,让 i=2(如果发生某些休眠异常,它不会被 catch 块捕获),仍然应该为其余的迭代值执行代码i=3 到 i=5.
无论出现什么例外,都应该在 catch 块中捕获(如使用 Excetion class),但它没有发生。我不太清楚为什么会这样,有人可以帮我解决这个问题吗?
OptimisticLockException 被抛出并且没有执行迭代的其余部分它被终止
您确定没有遇到事务异常吗?如果 doStuff
中发生了什么事情,它可能会破坏交易,将其标记为无效。一旦您离开 executeMethod
,Spring 就会尝试提交事务,但失败,抛出另一个异常(在代理中)。
如果处于调试级别,您应该始终记录异常。另外,如果你想捕获事务异常,你必须在调用者中进行。
通过代理抛出的异常将正确回滚事务。由于你抓住它并忽略它,错误是 "hidden" 到 Spring.
A.java
try{
for(i=1;i<=5;i++){
List<Integer> intList = new ArrayList();
bService.executeMethod(i,intList);
}
}catch(Exception e){
logger.error("exception occoured {}",e);
}
B.java
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void executeMethod(int i, List<Integer> intList){
try{
.......dostuff;
}catch(Exception e){
strList.add(i)
}
}
如果任何迭代的 executeMethod() 出现问题,让 i=2(如果发生某些休眠异常,它不会被 catch 块捕获),仍然应该为其余的迭代值执行代码i=3 到 i=5.
无论出现什么例外,都应该在 catch 块中捕获(如使用 Excetion class),但它没有发生。我不太清楚为什么会这样,有人可以帮我解决这个问题吗?
OptimisticLockException 被抛出并且没有执行迭代的其余部分它被终止
您确定没有遇到事务异常吗?如果 doStuff
中发生了什么事情,它可能会破坏交易,将其标记为无效。一旦您离开 executeMethod
,Spring 就会尝试提交事务,但失败,抛出另一个异常(在代理中)。
如果处于调试级别,您应该始终记录异常。另外,如果你想捕获事务异常,你必须在调用者中进行。
通过代理抛出的异常将正确回滚事务。由于你抓住它并忽略它,错误是 "hidden" 到 Spring.