org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has
2015-11-26 14:08
453 查看
ERROR: org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only
[java] view
plaincopyprint?
@Transactional
public void foo() {
try{
bar();
} catch (RuntimeException re) {
// caught but not throw further
}
}
@Transactional
public void bar() {
}
如果foo在调用bar的时候,bar抛出RuntimeException,Spring在bar return时将Transactional标记为Rollback only, 而foo捕获了bar的RuntimeException,所以Spring将会commit foo的事务,但是foo和bar使用的是同一事务,因此在commit foo事务时,将会抛出UnexpectedRollbackException。注意:如果foo和bar在同一class中,不会出现这种情况,因为:
Since this mechanism is based on proxies, only 'external' method calls coming in through the proxy will be intercepted. This means that 'self-invocation', i.e. a method within the target object calling some other method of the
target object, won't lead to an actual transaction at runtime even if the invoked method is marked with @Transactional!
可以通过配置log4j来debug Spring事务获取情况:
To delve more into it I would turn up your log4j logging to debug and also look at what ExerciseModuleController is doing at line 91, e.g.: add a logger for org.springframework.transaction
[java] view
plaincopyprint?
@Transactional
public void foo() {
try{
bar();
} catch (RuntimeException re) {
// caught but not throw further
}
}
@Transactional
public void bar() {
}
如果foo在调用bar的时候,bar抛出RuntimeException,Spring在bar return时将Transactional标记为Rollback only, 而foo捕获了bar的RuntimeException,所以Spring将会commit foo的事务,但是foo和bar使用的是同一事务,因此在commit foo事务时,将会抛出UnexpectedRollbackException。注意:如果foo和bar在同一class中,不会出现这种情况,因为:
Since this mechanism is based on proxies, only 'external' method calls coming in through the proxy will be intercepted. This means that 'self-invocation', i.e. a method within the target object calling some other method of the
target object, won't lead to an actual transaction at runtime even if the invoked method is marked with @Transactional!
可以通过配置log4j来debug Spring事务获取情况:
To delve more into it I would turn up your log4j logging to debug and also look at what ExerciseModuleController is doing at line 91, e.g.: add a logger for org.springframework.transaction
相关文章推荐
- Java 内部类的使用
- java解析XML的三种方法
- eclipse如何设置成保护眼的背景色
- Spring 学习日记 (四) Spring 整合Mybaits 和 struts2 框架的配置文件
- Java中读取某个目录下的所有文件和文件夹
- java 内存溢出
- java 内存溢出
- 轻量级 Java Web 框架技术选型
- eclipse和Mingw开发环境搭建
- JAVA经典实例
- java扫雷的简单实现
- [ git ] eclipse如何与git 配合工作。
- eclipse maven pom.xml错误
- JAVA Basic
- quartz集群
- java IO流测试
- java 分割字符串后放入List中
- Eclipse自动生成作者、日期注释等功能设置
- ubuntu 14.04 install eclipse
- springBoot学习