Spring Boot 中的事务同步
Posted
技术标签:
【中文标题】Spring Boot 中的事务同步【英文标题】:Transaction synchronization in Spring Boot 【发布时间】:2018-08-03 17:02:27 【问题描述】:我有一个小型 Spring Boot 应用程序,其中 spring-boot-starter-web
、spring-boot-starter-data-jpa
和 postgresql
作为依赖项。
我能够使用@Transactional
注释并使用JPA 来获取实体并将其保存到数据库中。但是,如果我要通过注册同步添加afterCommit
/afterCompletion
挂钩,它会给出IllegalStateException
说Transaction synchronization is not active
。
TransactionSynchronizationManager.registerSynchronization(
new TransactionSynchronizationAdapter()
@Override
public void afterCommit()
//this doesn't get called
log.info("do something here");
);
执行TransactionSynchronizationManager.initSynchronization();
会消除错误,但不会调用挂钩(例如:即使事务已提交,也不会调用afterCommit
挂钩。)
关于如何调试的任何线索?
【问题讨论】:
提交后你想做什么? 新的 TransactionSynchronizationAdapter() 已弃用 【参考方案1】:原来我忘记包含用于为具有@Transactional 注释的 bean 创建 AoP 代理的构建插件。
在没有这个插件的情况下,不会生成代理,代码会以非事务方式运行;除了当它进入JpaRepository
方法时,它会在调用期间创建一个短期事务(例如save
/findAll
/delete
)。
这是我错过的插件,包括在我的 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>
【讨论】:
【参考方案2】:我认为您需要@TransactionalEventListener
注释。它支持钩子 BEFORE_COMMIT、AFTER_ROLLBACK、AFTER_COMPLETION、AFTER_COMMIT 和 AFTER_ROLLBACK。
这篇文章的更多信息:Better application events in Spring Framework 4.2。
【讨论】:
以上是关于Spring Boot 中的事务同步的主要内容,如果未能解决你的问题,请参考以下文章
spring boot中的@Transactionnal注解真的会创建事务吗?
企业分布式微服务云SpringCloud SpringBoot mybatis (十七)Spring Boot中的事务管理