美好的一天。以下代码:
class A{
private B b;
@Transactional
public SomeResult doSomething(){
SomeResult res = null;
try {
// do something
} catch (Exception e) {
res = b.saveResult();
}
return res ;
}
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
class B{
public SomeResult saveResult(){
// save in db
}
}
据我所知,如果方法doSomething
中存在异常,则不会回滚事务。以及如何使其滚动?并返回SomeResult
答案 0 :(得分:17)
您不应该以编程方式调用Rollback。根据{{3}}的建议,最好的方法是使用声明式方法。为此,您需要注释哪些异常将触发回滚。
在你的情况下,像这样
@Transactional(rollbackFor={MyException.class, AnotherException.class})
public SomeResult doSomething(){
...
}
查看docs和有关@Transaction API的文档。
如果尽管有文档推荐,您希望进行程序化回滚,那么您需要按照已建议的方式从TransactionAspectSupport
调用它。这来自文档:
public void resolvePosition() {
try {
// some business logic...
} catch (NoProductInStockException ex) {
// trigger rollback programmatically
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
但可能存在架构错误。如果你的方法失败并且你需要抛出异常,你不应该期望它返回任何东西。也许你对这个方法承担了太多的责任,应该创建一个只对模型数据进行建模的分离,并在出现问题时抛出异常,回滚事务。无论如何,请阅读文档。
答案 1 :(得分:2)
使用TransactionAspectSupport.currentTransactionStatus()获取TransactionStatus ect事务管理器到你的bean尝试在事务管理器中调用Rollback(DefaultTransactionStatus状态)。
参考spring documentation
强烈建议您使用声明式方法 尽可能回滚。程序化回滚应该可用 你绝对需要它,但它的使用在面对实现一个 清洁基于POJO的架构。