SpringBoot 7个事务注解解析

本文深入解析Spring框架中事务传播属性的7种模式,包括REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER和NESTED。通过具体代码示例,详细阐述每种模式下事务的开启、挂起、新建和回滚行为,帮助开发者准确理解和应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

REQUIRED

 
首先看看Spring官方的源码
Spring官方的源码
中文解释:支持当前事务,如果当前没有事务,则创建一个新的事务。

/**
 * insertDepartment方法使用事务,insertEmployee方法不使用事务,
 * 假设在insertDepartment中调用insertEmployee方法,
 * insertEmployee方法也会包含事务,出现异常会回滚。
 * 假设在insertEmployee中调用insertDepartment方法,
 * 因为insertEmployee没有事务,所以insertDepartment会自己新建一个事务
 */
@Transactional(propagation = Propagation.REQUIRED)
public void insertDepartment() {
    //TODO
}
public void insertEmployee() {
    //TODO
}

 
 

SUPPORTS

 
老规矩,先上源码
Spring官方源码
中文翻译:支持当前事务,如果当前不存在事务,则不使用事务

/**
 * 如果在insertDepartment中包含事务,并且调用了insertEmployee,
 * 即当前存在事务,则insertEmployee会加入当前事务
 */
@Transactional(propagation = Propagation.REQUIRED)
public void insertDepartment() {
    insertEmployee();
}
@Transactional(propagation = Propagation.SUPPORTS)
public void insertEmployee() {
    //TODO
}
/**
 * 如果在insertDepartment中不包含事务
 * 即当前不存在事务,则insertEmployee不使用事务
 */
public void insertDepartment() {
    insertEmployee();
}
@Transactional(propagation = Propagation.SUPPORTS)
public void insertEmployee() {
    //TODO
}

 
 

MANDATORY

 
老规矩,先上源码
Spring官方源码
中文翻译:支持当前事务,如果当前不存在事务,则抛出异常。
使用该注解,方法本身不创建事务,调用其的父方法必须包含事务,如果不包含事务就撂挑子不干。

/**
 * insertDepartment方法必须包含事务,不管是使用上面的SUPPORTS继承事务,
 * 还是使用REQUIRED继承事务或自己新建事务。如果不包含事务,insertEmployee会抛出异常。
 */
@Transactional(propagation = Propagation.REQUIRED)
public void insertDepartment() {
    //TODO
}
@Transactional(propagation = Propagation.MANDATORY)
public void insertEmployee() {
    //TODO
}
/**
 * insertEmployee会抛出异常。
 */
public void insertDepartment() {
    //TODO
}
@Transactional(propagation = Propagation.MANDATORY)
public void insertEmployee() {
    //TODO
}

 
 

REQUIRES_NEW

 
老规矩,先上源码康康
SpringBoot官方源码
中文翻译:创建一个新的事务,如果当前存在事务,则暂停(挂起)当前的事务。

/**
 * insertDepartment中包含事务
 * insertEmployee执行时会将当前事务挂起,新建一个事务
 */
@Transactional(propagation = Propagation.REQUIRES)
public void insertDepartment() {
    insertEmployee();
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void insertEmployee() {
    //TODO
}

 
 

NOT_SUPPORTED

 
老规矩,先上源码康康
SpringBoot官方源码
中文翻译:以无事务方式执行,如果当前有事务,则暂停(挂起)当前事务。

 
 

NEVER

 
老规矩,先上源码康康
SpringBoot官方源码
中文翻译:以无事务的方式执行,如果当前存在事务,则抛出异常。

/**
 * 调用insertEmployee方法的父方法不可以包含事务,
 * 如果使用了事务,insertEmployee方法会抛出异常
 */
//@Transactional(propagation = Propagation.REQUIRES)
public void insertDepartment() {
    insertEmployee();
}
@Transactional(propagation = Propagation.NEVER)
public void insertEmployee() {
    //TODO
}

 
 

NESTED

 
老规矩,先上源码康康
SpringBoot官方源码
中文翻译:如果当前有事务,以嵌套事务(子事务)的方式执行,嵌套事务独立提交或回滚。
如果当前没有事务,则当作REQUIRES执行。

/**
 * 主事务(insertDepartment)提交或回滚,子事务(insertEmployee)也会强制提交或回滚。
 * 但子事务提交或回滚,主事务可以通过捕捉异常等方法选择是否回滚。
 */
//@Transactional(propagation = Propagation.REQUIRES)
public void insertDepartment() {
    insertEmployee();
}
@Transactional(propagation = Propagation.NESTED)
public void insertEmployee() {
    //TODO
}

感写你的观看,我们下回再见!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值