您的位置:首页 > 编程语言 > Java开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: