任何RuntimeException都会触发回滚,任何选中的异常都不会
未检查的异常:
检查到的异常:
如果在我的业务逻辑中我发现了一个问题,并且我想回滚更改,我必须抛出一个新的RuntimeException?这并不是真正的RuntimeException (未检查的异常),因为我已经在逻辑中标识了它。或者也许我误解了这些概念?
我真正的问题是,在我的@服务方法中回滚事务的最佳实践是什么?
发布于 2010-12-10 04:32:42
如果使用检查异常,只需将它们添加到@Transactional
注释的rollbackFor
属性中即可。
@Transactional(rollbackFor = { MyInvalidUserException.class, MyApplicationException.class })
public void method() throws MyInvalidUserException, MyApplicationException {
...
...
}
等。
fine的答案也很好用。如果您想要将编程事务管理混合到声明性事务中,或者让它保持严格的声明性,这是一个学术决定。
发布于 2012-08-16 06:37:16
从以下内容中以编程方式回滚:
@Transactional
public void commit() {
try {
// some business logic...
} catch (ConstraintViolationException e) {
// trigger rollback programmatically
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
或者将异常标记为回滚,并从调用方处理它:
@Transactional(rollBackFor = TransactionException.class)
public void commit() throws ConstraintViolationException{
try {
// some business logic...
} catch (ConstraintViolationException e) {
// handle the exception
// re-throw for rollback
new TransactionException(e);
}
}
public void doCommit(){
try {
commit()
} catch (TransactionException e){
// do nothing as already handled
}
}
我更喜欢前者,因为它使代码更简单,但根据Spring文档,它是discouraged:
如果您绝对需要的话,
可编程回滚是可用的,但是它的使用与实现一个干净的基于POJO的体系结构相冲突。
发布于 2010-12-10 04:09:48
它应该是这样的
@Transactional
public void method () throws YourCustomException {
try{
//logic
}catch(Exception ex){
TransactionAspectSupport.currentTransactionStatus()
.setRollbackOnly();
throw(new YourCustomException(ex.getMessage()));
}
}
https://stackoverflow.com/questions/4402506
复制相似问题