Java 回滚@Transactional注释的方法
你好。以下代码:Java 回滚@Transactional注释的方法,java,spring,hibernate,transactions,Java,Spring,Hibernate,Transactions,你好。以下代码: class A{ private B b; @Transactional public SomeResult doSomething(){ SomeResult res = null; try { // do something } catch (Exception e) { res = b.saveResult(); }
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
中存在异常,则不会回滚事务。如何使它滚动?并返回了一些结果,使用TransactionSpectSupport.currentTransactionStatus()获取TransactionStatus
ect事务管理器到您的bean尝试在事务管理器中调用回滚(DefaultTransactionStatus状态)
指弹簧
强烈建议您使用声明性方法来
尽可能回滚。如果需要,程序回滚是可用的
您绝对需要它,但它的使用面临着实现
干净的基于POJO的体系结构
您不应该以编程方式调用回滚。根据的建议,最好的方法是使用声明性方法。为此,您需要注释哪些异常将触发回滚 在你的情况下,像这样的
@Transactional(rollboor={MyException.class,AnotherException.class})
公共部分结果部分内容(){
...
}
请看一下有关的文档和文档
如果不考虑docs的建议,您希望进行编程回滚,那么您需要按照前面的建议从
TransactionSpectSupport
调用它。这是来自文档:
public void resolvePosition(){
试一试{
//一些商业逻辑。。。
}捕获(NoProductInStockException ex){
//以编程方式触发回滚
TransactionSpectSupport.currentTransactionStatus().setRollbackOnly();
}
}
不过,可能存在架构错误。如果你的方法失败了,你需要抛出一个异常,你不应该期望它返回任何东西。也许您给这个方法赋予了太多的责任,应该创建一个只对数据建模的独立方法,如果出现问题,就会抛出异常,回滚事务。无论如何,请阅读文档。
TransactionSpectSupport.currentTransactionStatus().setRollbackOnly()代码>仍会引发异常!如何从事务性方法返回某些内容?要使用TransactionSpectSupport,不幸的是,您必须确保方法/类上没有@transactional。这是一个黑客。一种新方法会更干净。