SpringBoot开启事务、手动事务

news/2025/2/25 16:44:14

文章优先发布在个人博客上面哦 https://www.xdx97.com/article/754707243290591232

Transactional_2">一、@Transactional

1-1、使用

我们只需要在类或者方法上面加上 @Transactional 注解,即可开启事务


Transactional_11">1-2、@Transactional的属性

属性名说明
name当在配置文件中有多个 TransactionManager , 可以用该属性指定选择哪个事务管理器。
propagation事务的传播行为,默认值为 REQUIRED。
REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务
isolation事务的隔离度,默认值采用 DEFAULT。
READ_UNCOMMITTED:读未提交,可能会导致脏读、幻读、不可重复读
READ_COMMITTED:读已提交,可能会导致幻读、不可重复读
REPEATABLE_READ:可重复读,可能会导致幻读
SERIALIZABLE:最高的隔离级别,严格服从事务的ACID
timeout事务的超时时间,默认值为-1。如果超过该时间限制但事务还没有完成,则自动回滚事务
readOnly指定事务是否为只读事务,默认为false,如果是true,那么就只能读
rollbackFor指定发生那些异常可以回滚,默认只支持运行时异常,或者它的子类
noRollbackFor指定发生那些异常不回滚事务

1-3、注意事项

  • @Transactional 只能用于public方法
  • 在父方法里面加上事务,那么调用子方法抛出异常一样会回滚,比如下面这样的代码
@Transactional(rollbackFor = {Exception.class})
public String exportExcel() throws IOException {
   testMapper.insertOne((int)(Math.random()*100));
   fun();
   return "dada";
}
public void fun(){
   testMapper.insertTwo((int)(Math.random()*100));
   fun1();
}
public void fun1(){
   testMapper.insertTwo((int)(Math.random()*100));
   int i = 1 / 0;
}
  • 在子方法里面加上事务注解,是无效的,比如下面这样的
public String exportExcel() throws IOException {
    testMapper.insertOne((int)(Math.random()*100));
    fun();
    return "dada";
}
@Transactional(rollbackFor = {Exception.class})
public void fun(){
    testMapper.insertTwo((int)(Math.random()*100));
    fun1();
}
@Transactional(rollbackFor = {Exception.class})
public void fun1(){
    testMapper.insertTwo((int)(Math.random()*100));
    int i = 1 / 0;
}

二、手动回滚事务

如果你需要对代码进行 try catch 处理,或者你想手动控制事务,我们可以使用下面这个代码进行手动回滚事务

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

在回滚事务之前,我们依旧要使用 @Transactional 注解开启事务

我们手动回滚事务的时候,就不需要在意是出现了什么异常,只要在这个事务内执行了回滚代码即可。
注:开启事务也还是应当在父方法里面的

下面代码中的 try catch 任选一个都可以对事物进行回滚,但是开启事务的注解只能在父方法这里,

@Transactional
public String exportExcel() {
    testMapper.insertOne((int)(Math.random()*100));
    fun();
    try {
        throw new IOException("243");
    }catch (Exception e){
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
    }
    return "dada";
}
public void fun() {
    testMapper.insertTwo((int)(Math.random()*100));
    fun1();
    try {
        throw new IOException("243");
    }catch (Exception e){
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
    }
}

public void fun1() {
    testMapper.insertTwo((int)(Math.random()*100));
    try {
        throw new IOException("243");
    }catch (Exception e){
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
    }
}

http://www.niftyadmin.cn/n/774940.html

相关文章

移动MAS发送短信,接受状态和接受回复【HTTP】

移动MAS短信平台就是一个发送短信的平台,可以发送普通短信、模板短信、一对一,一对多等短信 下面主要是基于Java(HTTP方式)实现短信的下行(发送)上行(接受)和接受短信状态 接口全是…

从GitLab拉取代码(不同分支拉取)

一、安装git https://blog.csdn.net/Tomwildboar/article/details/82312646 二、配置SSH https://blog.csdn.net/Tomwildboar/article/details/82313476 三、拉取代码 1、创建一个空文件夹,然后进去右键选择git bash输入下面的代码 git clone xxxxxxxxxx 来自下…

SpringBoot定时任务,@Async多线程异步执行

一、使用SpringBoot实现定时任务 这个不是重点,就简单的实现一下,至于cron表达式怎么写也不是重点,自行百度即可。 1-1、基于 Scheduled 注解的方式 import org.springframework.scheduling.annotation.EnableScheduling; import org.spring…

Sql一对多关联最新的一条数据

我们有如下表结构,一个是用户表,一个是记录表,一个用户会有多条记录,现在我们需要去查询出来每个用户的信息和最新的操作记录(这里以id值最大为最新的) CREATE TABLE record (id int(11) NOT NULL,u_id int…

SpringBoot搭建文件服务器

1、代码实现 FileUtils package com.xdx97.frame.common.utils;import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLC…

SpringBoot日志框架之使用logback作为日志框架

一、前言 1-1、slf4j log4j logback 的区别 可以理解成slf4j相当于List,而log4j相当于arrayList,logback相当于linkedList。也就是slf4j是一个日志接口,具体日志实现交给其它的框架。 1-2、为什么要使用logback来实现日志呢 log4j和logbac…

SpringBoot自定义异常

为什么要自定义异常呢? 已有的异常,我们无法更改它的信息(比如我们无法添加一个异常code),并且已有的异常是所有人都在用的异常,我们不好对它进行拦截特殊处理。 一、自定义异常 其实异常的种类&#xff0…

SpringBoot整合Redis附带视频源码

一、环境 Linux下安装Redis 1-1、SpringBoot 2.2.0 1-2、JDK 11 1-3、spring-boot-starter-data-redis 2.2.0 <!--Redis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifac…