zoukankan      html  css  js  c++  java
  • Spring事物的传播

    spring的事物对于同一个类内部调用是不会生效的。

    比如一个ServiceA,里面有个方法x()和y()。其中x没有配置事物,而y配置的有实物。如果是一个没有事物的ServiceB调用了ServiceA的x方法,而在x里面直接通过this.y()的方式调用y方法。那么y是不会有实物的,就算配置成PROPAGATION_REQUIRED 也是不会有事物的。

    反之,如果是没有事物的ServiceB先调用的ServiceA的y,而y又内部调用x这时候是有事物的。

    原理很简单,只有被spring托管的调用方式它才能在外层封装事物。

    execution(* com.aaa.someDao.*(..))  第一个* 号表示任意返回值,后面的*(..)表示任意参数

    PROPAGATION_REQUIRED  如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。

    PROPAGATION_SUPPORTS  支持当前事务,如果当前没有事务,就以非事务方式执行。

    PROPAGATION_MANDATORY  使用当前的事务,如果当前没有事务,就抛出异常。

    PROPAGATION_REQUIRES_NEW  新建事务,如果当前存在事务,把当前事务挂起。

    PROPAGATION_NOT_SUPPORTED  以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

    PROPAGATION_NEVER  以非事务方式执行,如果当前存在事务,则抛出异常。

    PROPAGATION_NESTED  如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

    我们系统启动事物的方式是:先通过AspectJExpressionPointcutAdvisor拦截,然后txadviser用org.springframework.transaction.interceptor.TransactionInterceptor来管理事物。

    
    
  • 相关阅读:
    django1.8升级1.9的几个问题
    App免费推广途径概要
    Django Channels 入门指南
    小谈业务应用架构
    比技术债更可怕的人债
    js数据结构与算法--递归
    常见react面试题汇总
    如何使用koa实现socket.io官网的例子
    Vue插槽
    10分钟了解 react 引入的 Hooks
  • 原文地址:https://www.cnblogs.com/my-king/p/11935391.html
Copyright © 2011-2022 走看看