@TransactionlEventListener 的事务问题
@TransactionalEventListener 是 Spring 框架提供的一个注解,用于在事务提交后或其他事务状态下执行事件监听器的方法。大多数情况下(也是默认的情况),我们一般会在事务提交后执行一些操作,例如发送消息、记录日志等。 @TransactionalEventListener 会在事务成功提交之后才触发监听器方法。如果我们对其运行机制理解不够深入,在使用过程中,很容易踩到坑。 问题说明 假设我们有这样一个业务场景:用户发表文章后需要记录用户操作,并在用户操作记录后发送通知。具体流程如下: 发表文章,发布"文章已发布"事件 监听文章发布事件,记录用户操作 操作记录保存后,发布"操作已记录"事件 处理操作记录后的通知发送逻辑 看起来很简单的流程,但实际实现时却踩到了坑。让我们看看具体的代码实现: @Service public class ArticleService { @Transactional public void publishArticle(Article article) { String articleId = "A" + System.currentTimeMillis(); article.setId(articleId); articleRepository.save(article); applicationContext.publishEvent(new ArticlePublishedEvent(articleId)); } } @Component public class ArticlePublishedEventListener { @TransactionalEventListener public void handle(ArticlePublishedEvent event) { userActionService.recordAction(event.getUserId(), "发表文章", event.getArticleId()); } } @Service public class UserActionService { @Transactional public void recordAction(Long userId, String action, String targetId) { UserAction userAction = new UserAction(userId, action, targetId); userActionRepository....