SpringBoot开启事务、手动事务

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

一、@Transactional

1-1、使用

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


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();
    }
}

猜你喜欢

转载自blog.csdn.net/Tomwildboar/article/details/108565757
今日推荐