美文网首页我爱编程
Spring的事务传播行为

Spring的事务传播行为

作者: Crazy_MC | 来源:发表于2018-07-26 13:18 被阅读0次

    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的事务配置

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

    <!-- 隔离级别配置-->
        <tx:advice id="txAdvice" transaction-manager="transactionManager">  
            <tx:attributes>  
                <tx:method name="find*" propagation="SUPPORTS" read-only="true" />  
                <tx:method name="query*" propagation="SUPPORTS" read-only="true" />  
                <tx:method name="list*" propagation="SUPPORTS" read-only="true" />  
      
                <tx:method name="create*" propagation="REQUIRED" />  
                <tx:method name="save*" propagation="REQUIRED" />  
                <tx:method name="modify*" propagation="REQUIRED" />  
                <tx:method name="update*" propagation="REQUIRED" />  
                <tx:method name="delete*" propagation="REQUIRED" />  
                <tx:method name="*" propagation="SUPPORTS" read-only="true" />  
            </tx:attributes>  
        </tx:advice>
    
    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的事务传播行为

        本文链接:https://www.haomeiwen.com/subject/mhqbmftx.html