SpringBoot 事务的属性rollbackFor 与 propagetion

rollbackFor介绍

默认情况下,只有出现 RuntimeException 才回滚异常。rollbackFor属性用于控制出现何种异常类型,回滚事务。

  @Override
  @Transactional
   public void insert()  {
            classesMapper.delete(1);//删除班级
            
            int n =1/0;//发送运行时异常,数据正常回滚

			//手动抛出异常数据不回滚
            //if(true){thow new Exceptiom("手动抛出异常");}

            testMapper.delete(1);//根据班级删除学生
    }

默认情况下 @Transactional 只会回滚运行时的异常,如果手动抛出一个异常,那么数据将不会发送回滚,因为他是手动抛出的。
可以通过rollbackFor属性进行配置,让手动抛出的异常也回滚。

	@Override
    @Transactional(rollbackFor = Exception.class)
   public void insert()  {
  	//Exception表示异常类型,也可以指定其他的。
  	// Exception表示出现所有异常都回滚数据
    }

propagetion介绍

事务传播行为:指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制。

有两个方法,a方法调用了b方法,而这两个方法都配置了事务,这时候两个方法用的是同一个事务,

   @Transactional
    public  void a(){
        test.b();
    }
  @Transactional
    public  void b(){

    }

案例

 @Transactional
    public  void b(){
		//记录日志代码....
    }
  @Transactional
    public  void a(){
   try {
           //执行逻辑....
           int n=1/0;//发送异常
    
     }
     finally {
         
          //这时候并不会成功的记录日志 因为发生异常 回滚了 两个用的是同一个事务
          test.b(); 
          //记录日志 
       }
       
    }

这时finally用的是同一个事务 因为try的代码导致事务回滚了,所以记录日志的方法没有执行成功。这时候可以使用
@Transactional(propagation = Propagation.REQUIRES_NEW) 表示额外开启一个新的事务,不管有没有try{}里面有没有发生异常互不影响。

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public  void b(){
		//记录日志代码....
    }  

事务的传播行为

  • REQUIRED 【默认值】需要事务,有则加入,无则创建新事务
  • REQUIRES NEW 需要新事务,无论有无,总是创建新事务
  • SUPPORTS 支持事务,有则加入,无则在无事务状态中运行
  • NOT SUPPORTED 不支持事务,在无事务状态下运行,如果当前存在已有事务,则挂起当前事务
  • MANDATORY 必须有事务,否则抛异常
  • NEVER 必须没事务,否则抛异常

你可能感兴趣的:(Spring,Boot,spring,boot,数据库,后端,java,spring,青少年编程,junit)