我第一次尝试使用Spring但是遇到了@Transactional的问题。我的应用程序的某些部分需要在方法中记录异常,而不是将它们冒泡到,例如main()
。但问题是,如果发生异常,那些标有@Transactional的方法将不会回滚。
简而言之,这不会起作用
@Transactional
public void doStuff() {
try {
//Do something that might cause an Exception
} catch (Exception e) {
log.error("Exception when trying to do stuff", e);
}
}
因为根据我的理解,如果发生异常,事务将永远不会回滚。
我能提出的唯一解决方案:
public void doStuff() {
try {
doStuff0();
} catch (Exception e) {
log.error("Error encountered while attempting to join servers", e);
}
}
@Transactional
protected void doStuff0() {
//Do something that might cause an Exception
}
虽然这很难看,使用了我不喜欢的模式,在这个例子中几乎是代码的两倍。
是否有其他替代方法可以记录异常并回滚事务?
答案 0 :(得分:1)
实际上有一种简单的方法可以做你想要的。建筑宇航员讨论它是否是一个好主意或何时适合放在一边,有时你只需要它工作:):
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
这很容易。
答案 1 :(得分:0)
只需重新抛出异常:
@Transactional
public void doStuff() {
try {
//Do something that might cause an Exception
} catch (Exception e) {
log.error("Exception when trying to do stuff", e);
throw e;
}
}