事务同步管理器TransactionSynchronizationManager详解

为了更好地理解 TransactionSynchronizationManager.registerSynchronization() 方法的使用,我们可以结合一个具体的案例,探讨如何在 Spring 中实现事务同步,并注册相应的事务同步对象。

案例背景

假设我们有一个简单的业务场景:在用户注册时,我们需要在数据库中创建用户记录,并且还需要向消息队列发送一条欢迎消息。为了保证这两个操作的原子性,即要么同时成功,要么同时失败,使用事务管理非常重要。

实际代码示例

1. 创建同步对象

首先,我们需要创建一个实现 TransactionSynchronization 接口的类,来处理事务结束后的操作,这里我们称之为 WelcomeMessageSynchronization。

java 复制代码
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;

public class WelcomeMessageSynchronization implements TransactionSynchronization {

    private String message;

    public WelcomeMessageSynchronization(String message) {
        this.message = message;
    }

    @Override
    public void afterCommit() {
        // 在事务提交后发送消息
        sendMessageToQueue(message);
    }

    private void sendMessageToQueue(String message) {
        // 这一部分逻辑用于将消息发送到消息队列中
        System.out.println("Sending message to queue: " + message);
    }

    // 其他未实现的方法可以留空或提供其他逻辑
}
2. 注册事务同步

接下来,我们在服务层的事务方法中注册这个同步对象。

java 复制代码
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {

    @Transactional
    public void registerUser(String username, String welcomeMessage) {
        // 这里可以是存储用户的逻辑,比如调用用户仓库保存用户到数据库
        saveUserToDatabase(username);
        
        // 注册事务同步,用于在事务提交后发送欢迎消息
        TransactionSynchronizationManager.registerSynchronization(new WelcomeMessageSynchronization(welcomeMessage));
    }

    private void saveUserToDatabase(String username) {
        // 模拟向数据库中存储用户记录
        System.out.println("User " + username + " saved to database.");
    }
}

业务流程解释

  1. 开启事务 :当调用 registerUser 方法时,Spring 会自动建立一个数据库事务,因为这个方法被 @Transactional 注解标记。

  2. 保存用户记录 :用户记录通过 saveUserToDatabase 方法被保存到数据库中。此时尚未提交事务。

  3. 注册同步对象 :在用户成功储存后,我们通过 TransactionSynchronizationManager.registerSynchronization() 方法注册 WelcomeMessageSynchronization 对象。

  4. 事务提交 :当 registerUser 方法执行完毕,Spring 会在方法结束后尝试提交事务。如果提交成功,afterCommit() 方法将被调用。

  5. 发送消息 :在 afterCommit() 被调用时,sendMessageToQueue 方法会被执行,从而向消息队列中发送欢迎消息。此时,只有在整个事务成功后,消息才会被发送,保证了操作的原子性。

处理回滚的情况

如果在 registerUser 方法执行过程中发生了异常(例如,保存到数据库失败),Spring 会自动回滚事务,afterCommit() 方法将不会被调用,因此消息不会被发送。这确保了只有在成功注册用户的情况下,才会向消息队列发送欢迎消息。

总结

通过这个具体的案例,我们可以看到 TransactionSynchronizationManager.registerSynchronization() 是如何在 Spring 事务管理中发挥重要作用的。它使得我们可以在事务的生命周期中控制额外的行为,并确保与当期事务的原子性相一致。

【编程电子书大全】
https://pan.baidu.com/s/1kQuageER_G0DCTfEBsQH8Q?pwd=s78c
https://pan.quark.cn/s/6e5ceb74b591

相关推荐
学长毕设几秒前
基于SpringBoot的校园礼服租赁系统的设计与实现
java·spring boot·后端
明天也要努力学习6 分钟前
深入理解 JVM 垃圾回收(GC)
java·jvm
golang学习记14 分钟前
IDEA 断点调试技巧:拖拽
java·ide·intellij-idea
Sayai15 分钟前
Flink 日志解析任务性能优化实战:正则/Grok 预编译、Guava 缓存权重陷阱与 ES 写入隔离
java·大数据·性能优化·flink·实时计算
计算机毕设定制辅导-无忧学长17 分钟前
《基于物品协同过滤的闲置书换购微信小程序设计开发》
java·vue.js·spring boot·微信小程序·uniapp·闲置书换购微信小程序·物品协同过滤算法
Best_Liu~18 分钟前
SpringBoot全局日期格式化
java·spring boot·后端
少年的范儿29 分钟前
IntelliJ IDEA 配置 JDK 21 与 Maven 教程(Windows):开发环境配置与验证
java·jdk·maven·intellij idea
RuoyiOffice30 分钟前
SpringBoot3 + openGauss:RuoYi Office 登录、流程发布与用印填报适配实战
java·数据库·spring boot·opengauss·信创
Dwzun1 小时前
基于SpringBoot3+Vue3的油莎豆种植管理系统
java·前端·vue.js·spring boot·后端·python·计算机网络
学长毕设9 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端