gpt4 book ai didi

java - spring @Transactional 不会回滚

转载 作者:行者123 更新时间:2023-11-29 07:30:57 24 4
gpt4 key购买 nike

我在 @Service 中有一段类似的代码:

@Autowired
private MyDAO myDAO;

@Transactional
@Override
public void m(...) {
Integer i = null; // this is just to simulate a NPE
myDAO.saveX(...);
i.toString(); // throws NullPointerException
myDAO.saveY(...);
}

这段代码抛出一个 NPE,它没有被 Spring 捕捉到,所以我的代码没有回滚。知道为什么会这样吗?

我在我的应用程序的其他地方有相同的配置,并且在那些地方它按预期工作。

<jee:jndi-lookup id="dataSource" jndi-name="jdbc/MyDataSource"/>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>

最佳答案

可能的原因:

  1. 您的 bean 不是由 Spring 管理的,也就是使用 new 创建的,而不是从应用程序上下文中获取的。

  2. 您正在同一类/bean 的另一个方法中调用 m() 方法。默认情况下,Spring 使用代理来管理声明式事务,不支持内部调用。

  3. 您正在抛出已检查的异常并且没有在 dao 上使用 @Repository。声明式事务仅适用于运行时异常。 @Reposiotry 通过将所有异常包装在 DataAccessException 中来“修复”这个问题。 (可能不是这样,因为 NPE 是运行时的)

关于java - spring @Transactional 不会回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42720869/

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