Spring(一)Spring的7种事务传播行为
创始人
2024-05-29 22:08:13
0

目录

    • 1.7种事务传播行为
    • 2.事务使用示例
    • 3.REQUIRES_NEW 事务传播行为使用示例
      • 3.1 事务传播图
      • 3.2 TUserAServiceImpl.java
      • 3.3 TUserBServiceImpl.java

1.7种事务传播行为

Spring 中定义了七种事务传播行为,分别是:(propagation:n.传播,宣传,培养)

  1. REQUIRED:如果当前存在事务,则加入该事务,否则新建一个事务。这是最常见的传播行为,也是默认的传播行为。
  2. SUPPORTS:支持当前事务,如果当前不存在事务,则以非事务方式执行。
  3. MANDATORY:强制要求当前存在事务,如果不存在事务,则抛出异常。(mandatory:adj.强制的)
  4. REQUIRES_NEW:重新开启一个新的事务,如果当前存在事务,则挂起该事务。
  5. NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,则挂起该事务。
  6. NEVER:以非事务方式执行操作,如果当前存在事务,则抛出异常。
  7. NESTED:如果当前存在事务,则嵌套事务中执行。嵌套事务是相对于外部事务而言的,它可以独立提交或回滚,但是嵌套事务的提交或回滚并不会对外部事务产生影响。如果外部事务不存在,那么 NESTEDREQUIRED 的效果是一样的。该传播行为只有在使用 JDBC 事务时才有效。

事务传播行为决定了一个方法执行时如何参与到已有的事务中,或者如何创建新的事务。需要根据实际的业务场景和要求来选择合适的事务传播行为。

2.事务使用示例

使用事务传播行为需要在方法上加上 @Transactional 注解,并指定传播行为,例如:

@Transactional(propagation=Propagation.REQUIRED)
public void doSomething() {// ...
}

这样就将 doSomething() 方法设置为在当前存在事务时,加入该事务,如果不存在事务,则创建一个新的事务。如果需要设置其他的传播行为,只需要将 Propagation.REQUIRED 替换成其他传播行为即可。同时,需要保证 @Transactional 注解在方法所在的类上被正确地启用了事务管理。

3.REQUIRES_NEW 事务传播行为使用示例

REQUIRES_NEW 是 Spring 中的一个事务传播行为。

  • 作用: 创建一个新的事务,并暂停当前事务(如果存在)。
  • 使用场景: 可以使用这个传播行为来确保一个方法执行时独立于调用它的方法所在的事务。
  • 场景示例: 日志记录场景。PostgreSQL 同一事务中,如果事务中间有报错,后面的所有SQL都会执行失败。这时我们就非常需要 PRAOPAGATION_REQUIRES_NEW 这种事务传播行为。

3.1 事务传播图

下面是一个使用 REQUIRES_NEW 事务传播行为的示例:

在这里插入图片描述

3.2 TUserAServiceImpl.java

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.demo.module.entity.TUser;
import com.demo.module.mapper.TUserMapper;
import com.demo.module.service.TUserAService;
import com.demo.module.service.TUserBService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import java.time.LocalDateTime;/*** 

* 用户表 服务实现类*

** @author ACGkaka* @since 2021-04-25*/ @Slf4j @Service public class TUserAServiceImpl extends ServiceImpl implements TUserAService {@Autowiredprivate TUserBService tUserBService;@Override@Transactional(rollbackFor = Exception.class)public void addUserA() {// 添加用户ATUser user = new TUser(null, "username_aaa", "pwd_aaa", LocalDateTime.now(), LocalDateTime.now());this.save(user);// 调用方法Btry {tUserBService.addUserB();} catch (Exception e) {log.error("addUserA filed. reason: {}", e.getMessage());}} }

3.3 TUserBServiceImpl.java

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.demo.module.entity.TUser;
import com.demo.module.mapper.TUserMapper;
import com.demo.module.service.TUserBService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;import java.time.LocalDateTime;/*** 

* 用户表 服务实现类*

** @author ACGkaka* @since 2021-04-25*/ @Slf4j @Service public class TUserBServiceImpl extends ServiceImpl implements TUserBService {@Override@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)public void addUserB() {// 添加用户BTUser user = new TUser(null, "username_bbb", "pwd_bbb", LocalDateTime.now(), LocalDateTime.now());this.save(user);throw new RuntimeException("抛出异常");} }

整理完毕,完结撒花~

上一篇:MySQL如何开启binlog

下一篇:HCIP笔记

相关内容

热门资讯

仕净科技7月4日获融资买入15... 7月4日,仕净科技跌3.08%,成交额1.54亿元。两融数据显示,当日仕净科技获融资买入额1521....
安联锐视7月4日获融资买入86... 7月4日,安联锐视跌1.80%,成交额1.01亿元。两融数据显示,当日安联锐视获融资买入额865.3...
山水比德7月4日获融资买入16... 7月4日,山水比德跌0.85%,成交额3793.75万元。两融数据显示,当日山水比德获融资买入额16...
固高科技7月4日获融资买入88... 7月4日,固高科技跌1.50%,成交额1.21亿元。两融数据显示,当日固高科技获融资买入额881.6...
国子软件7月4日获融资买入21... 7月4日,国子软件跌2.09%,成交额7516.05万元。两融数据显示,当日国子软件获融资买入额21...
热威股份7月4日获融资买入15... 7月4日,热威股份跌1.19%,成交额2527.77万元。两融数据显示,当日热威股份获融资买入额15...
三态股份7月4日获融资买入84... 7月4日,三态股份跌0.68%,成交额1.25亿元。两融数据显示,当日三态股份获融资买入额842.6...
澎湖列岛有什么著名人物 澎湖列岛有什么著名人物"澎湖县出身人物"分类中的页面本分类只有下列一个页面。B白文正G高植澎H洪冬桂...
惠柏新材7月4日获融资买入84... 7月4日,惠柏新材跌1.96%,成交额8530.81万元。两融数据显示,当日惠柏新材获融资买入额84...
机科股份7月4日获融资买入54... 7月4日,机科股份跌2.67%,成交额5481.29万元。两融数据显示,当日机科股份获融资买入额54...