gpt4 book ai didi

java - 为什么@Transactional 在抛出 NullPointerException 后不回滚?

转载 作者:行者123 更新时间:2023-12-04 08:49:45 30 4
gpt4 key购买 nike

我有一个可以抛出 NullPointerException 的方法。该方法标记为 @Transactional .
我的代码结构如下:

public void outer() {
try {
inner();
} catch (Exception e) {
// exception caught
}
}

@Transactional
public void inner() {
database.saveStuff();
throw new NullPointerException();
}
运行上述代码后,数据库更新在 inner()里面不会回滚。什么会导致这样的问题?
根据我的理解,如果异常对注释“可见”,则应回滚数据库操作。在这种情况下意味着 inner()方法标记为 @Transactional并抛出异常而不是捕获它。
可能还值得一提的是方法 outer()在另一个内部也被称为 @Transactional方法,该方法又位于 try catch 中.但是,该异常对该方法不可见,因为它被捕获在 outer() 中。 ,所以根据我的理解,这应该无关紧要。
我试图在网上搜索答案,但所有答案似乎都是关于未自动回滚的已检查异常(例如 java.lang.Exception )。因为 NullPointerExceptionRuntimeException 的子类,这应该不是问题。
我团队中的某个人也建议使用这组注释,但没有任何区别:
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Transactional(rollbackFor=Exception.class, isolation=Isolation.READ_COMMITTED)

最佳答案

因为你打的是inner()直接地。 Spring AOP 仅适用于 bean 方法,因为 inner()直接调用它不会被代理,也不会添加拦截器。
正如你提到的 outer从具有 @Transactional 的方法调用方法因此,您应该删除 try-catch或重新抛出异常。

关于java - 为什么@Transactional 在抛出 NullPointerException 后不回滚?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64155462/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com