当前位置: 首页 > 知识库问答 >
问题:

spring-tx:仅当异常未被outmost方法捕获时才回滚

施驰
2023-03-14
@Transactional
public class OutterA {
    @Autowired
    private Inner inner;

    public void operationA1() {
        this.doSomething();
        inner.doSomething();
    }

    public void operationA2() {
        this.doSomething();
        try {
            inner.doSomething();
        } catch (Exception e) {
            inner.tryAnother();
        }
    }

    public void doSomething() {

    }
}

@Transactional
public class Inner {
    public void doSomething() {
        throw new RuntimeException();
    }

    public void tryAnother() {

    }
}

在上面的代码中,我希望操作A1会回滚,因为没有捕获异常并导致事务结束,而操作A2会成功,因为在事务结束前捕获并正确处理了异常。但是Spring会把两者都回滚。

// Non-transactional
public class OutterB {
    @Autowired
    private Inner inner;

    public void operationB() {
        try {
            inner.doSomething();
        } catch (Exception ignore) {
        }
    }
}

在上面的代码中,我希望operationB总是回滚,因为事务是由inner启动的,异常是跨事务边界抛出的。

共有1个答案

宁浩博
2023-03-14

我认为您可以使用@transactionl注释选项,例如:

  • rollbackfor,rollbackforClassName
  • norollbackfor,norollbackforclassname

在代码段中,如果将@transactional(noRollbackFor=runtimeexception.class)放在innerclass上,事务将不会回滚。但是,将@transactional注释放在类级别上会影响该类中的每个公共方法,因此我建议您将此注释单独放在每个方法上,并使用这些选项定义特定的行为。

 类似资料:
  • 我的RMI服务器接口声明了一个方法foo(),该方法被声明为引发RemoteException和Exception,如下所示: 服务器实现为: 我的客户端在服务器上调用foo: 现在,当我运行客户端时,我得到: 从java类型的foo()中获取异常。rmi。异常异常:未声明的检查异常;嵌套的例外是:java。伊奥。InterruptedIOException:操作超时 Java文档是这样说的。rm

  • 问题内容: 关于程序流,这一直困扰着我一段时间。 我想知道是否有可能从Method中捕获错误,以阻止它执行通常无法跟着它执行的Method,就像下面我无法工作的示例所示。 我通常会有一个静态int变量,该变量会在程序运行时初始化为0,然后,如果某个方法捕获到异常,它将使int递增,并且每个方法仅在int为0时才运行。 这行得通,但我只是想知道是否可以用异常处理替换int shindig。 问题答案

  • 问题内容: 关于程序流,这一直困扰着我一段时间。 我想知道是否有可能从Method中捕获错误,以阻止它执行通常无法跟着它执行的Method,就像下面我无法工作的示例所示。 我通常会有一个静态int变量,该变量会在程序运行时初始化为0,然后,如果某个方法捕获到异常,它将使int递增,并且每个方法仅在int为0时才运行。 这行得通,但我只是想知道是否可以用异常处理替换int shindig。 问题答案

  • 问题内容: 为什么Java中的某些异常未被捕获?这是代码由于没有处理的异常而完全失败。(Java版本1.4)。 我得到一个 但这有效 我懂了 我以为捕获异常会捕获所有异常?如何捕获Java中的所有异常? 问题答案: 因为某些异常不是源自-例如和。 基本上,类型层次结构是: 只能抛出派生类,因此,如果您抓住,那实际上就可以抓住一切。 ,以及任何异常,从获得 其他 比那些源自数作为 检查的异常 -他们

  • 我对Java线程、Runnable等相当陌生。因此,我想知道为什么下面的代码没有捕获异常? 阅读有没有一种方法可以使Runnable的run()引发异常,我收集到: "...如果您的run()方法确实是Thread的目标,则抛出异常是没有意义的,因为它是不可观察的;抛出异常与不抛出异常(无)具有相同的效果。"(@erickson) 我应该检查Runnable.run()方法中的异常。 为什么会这样

  • 为什么Java中的一些异常不被捕获?这是完全失败的代码,有一个未处理的异常。(Java版本1.4)。 我在线程“main”java中得到了一个 但这行得通 我在java中没有发现任何方法错误。lang.NoSuchMethodError: 我以为捕获异常会捕获所有异常?如何捕获java中的所有异常?