美文网首页
Spring事务

Spring事务

作者: 3517902f1986 | 来源:发表于2017-03-15 14:15 被阅读82次

    Spring有7种传播机制

    事务传播行为类型 说明 备注
    PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,则加入到这个事务(默认) REQUIRED是和父事务共用connection的方式加入父事务,所以父事务对数据库的修改对子事务是可见的
    PROPAGATION_SUPPORTS 支持当前的事务,如果当前没有事务,就以非事务的方式处理 SUPPORTS是和父事务共用connection的方式加入父事务,所以父事务对数据库的修改对子事务是可见的
    PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,则抛出异常 MANDATORY是已和父事务共用connection的方式加入父事务,所以父事务对数据库的修改对子事务是可见的。
    PROPAGATION_RQUIRES_NEW 新建事务,如果当前存在事务,则把当前事务挂起 父事务对数据的修改是否对子事务有效取决于数据库的隔离级别。新事务发生异常不会导致旧事务回滚,同样如果旧事务在新事务执行完后发生异常也不会导致新事务回滚
    PROPAGATION_NOT_SUPPORTS 以非事务的方式执行操作,如果当前存在事务,就把事务挂起 父事务对数据的修改是否对子事务有效取决于数据库的隔离级别。如果在事务中,非事务方法发成异常,会抛到有事务的方法,同样会导致事务回滚。
    PROPAGATION_NEVER 以非事务的方式执行,如果当前存在事务,则抛出异常
    PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作 参见事务回滚1
    • 事务传播机制只适用于不同的bean之间方法的调用,如果一个bean中的两个方法相互调用则不会用到事务传播机制(同一个bean中,只要一个方法开启的了事务,则它调用的方法就运行在这个事务中)
    • 事务方法里如果抛出RuntimeException,则会导致相关事务回滚。
      1- 被NESTED标注的方法如果产生RuntimeException会导致事务回滚,与REQUIRED不同的是:如果父方法中catch了这个异常,则不会导致父事务的回滚(通过savePoint机制),如果父方法抛出了这个异常则同样会导致父方法回滚。
    • 事务中如果抛出Throwable或则Exception,默认不会导致相关事务回滚,一般都会在异常的地方提交,就有可能出现部分提交的问题。但可以配置rollback-back属性来控制。
      1- rollback-for属性只要发生指定异常类或则子类异常都会发生回滚。
      2- rollback-for属性对NOT_SUPPORTED无效。因为它本身不在事务中
      3- rollback-for属性对REQUIRED_NEW中,只会对本方法有效。
      4- rollback-for属性对NESTED,只会回滚到开始这个方法事务的savepoint上。

    Spring事务的其他属性配置

    • readOnly:这是一个最优化提示,表示事务应该被最优化为只读。在一些情况下,一些事务策略能够起到显著的最优化效果,例如在ORM工具中避免脏读检查(dirty checking)
    • Timeout:指定事务超时为几秒。在JTA中将被简单的传递到J2EE服务器的事务协调程序
      1- 在XML设置中使用timeout_NNN表示

    这里是测试链接

    相关文章

      网友评论

          本文标题:Spring事务

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