gpt4 book ai didi

java - 使用 TaskExecutor 提交后`TransactionSynchronizationManager` 内的事务

转载 作者:太空宇宙 更新时间:2023-11-04 11:46:58 24 4
gpt4 key购买 nike

我有一个在事务内通过 TransactionSynchronizationManager.registerSynchronization(...) 使用 TransactionSynchronization.afterCommit 的代码:

TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
@Override
public void afterCommit() {
Manager.save(param)
}
});

在 afterCommit 代码中调用带有 @Transactional 的方法:

public class ManagerImpl implements Manager {
@Transactional
public void save(...) { ... }
}

我使用 Spring、Hibernate 和 EntityManagerFactory,此代码在 Spring MVC 内部运行时运行良好,否则,当出现 Web 请求但在 TaskExecutor (org.springframework.scheduling.concurrent.ThreadPoolTask​​Executor) 内部运行时,我收到错误:

javax.persistence.TransactionRequiredException: no transaction is in progress
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.checkTransactionNeeded(AbstractEntityManagerImpl.java:1171)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:1332)
at sun.reflect.GeneratedMethodAccessor2083.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:293)
at com.sun.proxy.$Proxy147.flush(Unknown Source)
//called entityManager.flush()

我使用 TransactionSynchronizationManager.isActualTransactionActive() 检查了交易,它返回 true。

最佳答案

当调用#afterCommit()方法时,Spring可能仍然会看到上下文绑定(bind)到现有事务,只是事务已被提交;这就是为什么你看到它可能是活跃的。

根据该方法的 javadoc here ,如果您希望允许其他需要事务的代码运行,则需要强制 Spring 生成新的传播事务。因此,按如下方式更改您的 Manager#save 方法:

public class ManagerImpl implements Manager {
@Transactional(propagation = PROPAGATION_REQUIRES_NEW)
public void save( ... ) {
}
}

关于java - 使用 TaskExecutor 提交后`TransactionSynchronizationManager` 内的事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42258423/

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