Spring的事务传播行为

Spring的事务传播行为

  1. PROPAGATION_REQUIRED ,如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务

  2. PROPAGATION_SUPPORTS ,如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。

  3. PROPAGATION_MANDATORY ,如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。

  4. PROPAGATION_REQUIRES_NEW, 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。

  5. PROPAGATION_NOT_SUPPORTED, 总是非事务地执行,并挂起任何存在的事务。

  6. PROPAGATION_NEVER ,总是非事务地执行,如果存在一个活动事务,则抛出异常

  7. PROPAGATION_NESTED,如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按PROPAGATION_REQUIRED 属性执行

嵌套事务和新的事务的区别

新的事务,独立于之前的服务,互不影响提交回滚。
嵌套事务,是以之前的服务为父事务,起的一个子事务。子事务执行完之后,父事务才会接着实行。子事务的回滚不会导致父事务的回滚。但是父事务的回滚带导致子事务的回滚。父事务提交,子事务也回跟着提交。

Spring的事务配置

声明式的事务处理中,要配置一个切面,即一组方法,如


      
          
              
              
              
  
              
              
              
              
              
              
          
    
1、事务的传播性:@Transactional(propagation=Propagation.REQUIRED) 
      如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)

2、事务的超时性:@Transactional(timeout=30) //默认是30秒 
      注意这里说的是事务的超时性而不是Connection的超时性,这两个是有区别的

3、事务的隔离级别:@Transactional(isolation = Isolation.READ_UNCOMMITTED)
      读取未提交数据(会出现脏读, 不可重复读) 基本不使用

4、回滚:
    指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)
    指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})
    该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。

5、只读:@Transactional(readOnly=true)
    该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。

只读事务:如果你一次执行多条查询语句,多条查询SQL必须保证整体的读一致性,否则,在前条SQL查询之后,后条SQL查询之前,数据被其他用户改变,则该次整体的查询将会出现读数据不一致的状态,此时,应该启用事务支持

你可能感兴趣的:(Spring的事务传播行为)