我有一个小型 Spring Boot 应用程序,其中包含 spring-boot-starter-web
、spring-boot-starter-data-jpa
和 postgresql
作为依赖项。
我能够使用 @Transactional
注释并使用 JPA 来获取实体并将其保存到数据库中。但是,如果我通过注册同步来添加 afterCommit
/afterCompletion
Hook ,则会给出 IllegalStateException
表明 Transaction 同步不是活跃
。
TransactionSynchronizationManager.registerSynchronization(
new TransactionSynchronizationAdapter() {
@Override
public void afterCommit() {
//this doesn't get called
log.info("do something here");
}
});
执行 TransactionSynchronizationManager.initSynchronization();
可以消除错误,但不会调用 Hook (例如:afterCommit
Hook 甚至不会被调用尽管事务已提交。)
关于如何调试这个的任何线索?
最佳答案
事实证明,我忘记包含用于为具有 @Transactional 注释的 bean 创建 AoP 代理的构建插件。
如果没有这个插件,就不会生成任何代理,并且代码将以非事务方式运行;除了当它进入 JpaRepository 方法时,它将在调用期间创建一个短期事务(例如 save
/findAll
/删除
)。
这是我错过的包含在我的 pom.xml 中的插件(它是由 Spring Initializr ( https://start.spring.io/ )在 pom 输出中生成的,但我一开始没有注意到它,也没有将其复制到我的 pom)
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
关于spring - Spring Boot 中的事务同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48951243/