Spring中的事务传递性小记

在Spring中,事务的传递性主要由Propagation属性控制,它定义了当方法被其他方法调用时,应该如何处理事务。Propagation属性有以下几种值:

  1. PROPAGATION_REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中,这是最常见的选择。
  2. PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
  3. PROPAGATION_MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常。
  4. PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
  5. PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  6. PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
  7. PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。

下面是一个使用Java配置的例子:

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

public class UserService {

    @Transactional(propagation = Propagation.REQUIRED)
    public void registerUser(User user) {
        // 业务逻辑
        saveUser(user);
        saveUserLog(user);
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    private void saveUser(User user) {
        // 保存用户信息
    }

    @Transactional(propagation = Propagation.SUPPORTS)
    private void saveUserLog(User user) {
        // 保存用户日志
    }
}

在这个例子中,registerUser方法使用了REQUIRED传播级别,如果在调用registerUser时存在一个事务,那么这个方法将在相同的事务中运行,否则将开始一个新的事务。

saveUser方法使用了REQUIRES_NEW传播级别,这将总是创建一个新的事务,即使在调用它的方法已经在它自己的事务中运行。

saveUserLog方法使用了SUPPORTS传播级别,这意味着如果当前存在事务,那么该方法将在该事务中运行,但如果当前没有事务,那么该方法将以非事务方式运行。

相关推荐
zjjsctcdl1 天前
【prometheus】监控MySQL并实现可视化
数据库·mysql·prometheus
阿波罗尼亚1 天前
MySQL 存储引擎 FEDERATED
数据库·mysql
lym5400508891 天前
MySQL篇(管理工具)
数据库·mysql
1.14(java)1 天前
Spring-boot快速上手
java·开发语言·javaee
Darkdreams1 天前
SpringBoot项目集成ONLYOFFICE
java·spring boot·后端
NineData1 天前
杭州 OpenClaw 开发者聚会来了!NineData 叶正盛将带来主题分享
数据库·人工智能
bropro1 天前
【Spring Boot】Spring AOP中的环绕通知
spring boot·后端·spring
lhbian1 天前
【Spring Cloud Alibaba】基于Spring Boot 3.x 搭建教程
java·spring boot·后端
luom01021 天前
springcloud springboot nacos版本对应
spring boot·spring·spring cloud
代码雕刻家1 天前
3.6.Maven-依赖管理-依赖范围
java·maven