Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 回滚@Transactional注释的方法_Java_Spring_Hibernate_Transactions - Fatal编程技术网

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。这是一个黑客。一种新方法会更干净。