spring - Spring Boot 中的事务同步

标签 spring spring-boot spring-data-jpa spring-transactions

我有一个小型 Spring Boot 应用程序,其中包含 spring-boot-starter-webspring-boot-starter-data-jpapostgresql 作为依赖项。

我能够使用 @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/

相关文章:

java - 一个类的多个实例填充了来自 application.properties 的值

spring - Postgres - Spring Data JPA - 自动生成数据库和表格

java - 我正在尝试运行 spring 机器人应用程序,它显示执行 DDL 时出现 CommandAcceptanceException 错误

java - 有没有办法在使用 Spring Data JPA 的查询中使用列名作为参数?

Javax 持久性错误 : Unknown Entity com. samplewebentities.Customer

java - OneToMany 主键列错误

java - Spring 批处理 : reading a csv file and modify this list before putting the results in another file

java - 如何解密@ConfigurationProperties bean 中使用的属性?

Spring 4 - 拒绝所有端点的 "null"@RequestBody

java - server.servletPath=/* 在 spring-boot.version 2.1.7.RELEASE 中不起作用