- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在非事务性方法中调用 try-catch block 内的两个事务性方法。发生异常时,我能够捕获异常并将其记录下来。第一个事务方法不会回滚,但最后一个会。这种行为是我目前在 spring 事务管理中所理解的。
public void grab(){
try{
requestManager.updateRequest();
requestManager.saveTicket()
}catch (DataIntegrityViolationException dive) {
if (dive.getCause() instanceof ConstraintViolationException) {
LOGGER.error("ConstraintViolationException",dive);
}
}
}
在上面的代码中,ConstraintViolationException 发生在 saveTicket() 方法内部并且 saveTicket() 内部的 dao 甚至在捕获异常之前就已经回滚了它的事务(这就是我所知道的),并且第一个没有回滚因为它在另一个事务中。(这是我已经知道的行为)。
当我使用另一种调用这两个预览方法(updateRequest() 和 saveTicket())的事务方法时,我感到困惑,当 saveTicket() 方法中发生 ConstraintViolationException 时,即使捕获异常,它甚至会回滚 updateRequest() 方法.这是我的代码
public void grab(){
try{
requestManager.grabRequest();
}catch (DataIntegrityViolationException dive) {
if (dive.getCause() instanceof ConstraintViolationException) {
LOGGER.error("ConstraintViolationException",dive);
}
}
}
我所知道的是,这两种方法将在 grabRequest() 方法中加入相同的事务,但我的问题是,为什么即使我正在捕获异常,事务也会回滚?这是否意味着 spring 使用的代理甚至在我捕获异常之前就已经回滚了事务?
最佳答案
Does this mean that the proxy that spring uses already rolled back the transaction even before i catch the exception?
是的,在 JPA/Spring 注释中,您可以在 @Transactional
In its default configuration, the Spring Framework’s transaction infrastructure code only marks a transaction for rollback in the case of runtime, unchecked exceptions; that is, when the thrown exception is an instance or subclass of RuntimeException. ( Errors will also - by default - result in a rollback). Checked exceptions that are thrown from a transactional method do not result in rollback in the default configuration.
来自 http://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html
对于 JPA,它是 rollbackOn
和 dontRollbackOn
关于即使在非事务方法或 Controller 中捕获异常,Spring 事务方法也会回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40604203/
我是一名优秀的程序员,十分优秀!