我有这样的代码:
@Service
public class AService {
public void methodA() {
try {
methodB();
} catch (Exception e) {
methodC(e);
}
}
}
方法B 正在从数据库中读取。如果发生在数据库中,methodC 正在写入例外。出于某种原因,当方法 B 抛出错误时,方法 C 中的写入不起作用,我得到 - UnexpectedRollbackException:事务回滚,因为它已被标记为仅回滚。
将不胜感激任何建议,谢谢!
uj5u.com热心网友回复:
如果在 DB 访问期间出现例外,Hibernate通常会将完整事务标记为rollbackOnly
,即使有人会通过@Transactional(noRollbackFor=Exception.class)
注释属性显式尝试避免这种行为。
所以在这些情况下,需要有一个不同的解决方案,例如为两个方法呼叫设定单独的事务。
(类似问题:处理大资料插入的sql例外)
uj5u.com热心网友回复:
我假设您@Transactional
在内部某处有一个由 Spring( )管理的事务methodB
。在 Spring 中,当RuntimeException
在该事务中抛出a 时,该事务被标记为回滚。
来自 Spring 档案:
请参阅:https : //docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html#transaction-declarative-rolling-back
0 评论