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

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

<!-- 隔离级别配置-->
    <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事务 前言 这篇其实也要归纳到《常识》系列中,但这重点又...
    码农戏码阅读 10,202评论 2 59
  • 事务的嵌套概念 所谓事务的嵌套就是两个事务方法之间相互调用。spring事务开启 ,或者是基于接口的或者是基于类的...
    jackcooper阅读 5,258评论 0 10
  • 事务,是为了保障逻辑处理的原子性、一致性、隔离性、永久性。 通过事务控制,可以避免因为逻辑处理失败而导致产生脏数据...
    uzip柚子皮阅读 10,143评论 3 16
  • 母亲节(Mother's Day),是一个感谢母亲的节日。母亲们在这一天通常会收到礼物,康乃馨被视为献给母亲的花,...
    卫校一五康复阅读 903评论 0 0
  • 思考:零和博弈其背后的逻辑是非黑即白、你死我活模式,现实生活中有很多零和博弈的案例。 比如,最近和女儿做一个赌约,...
    杨雪雪阅读 3,290评论 0 0