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来管理事物。

    
    
  • 相关阅读:
    Zuul
    熔断机制
    跨域问题
    过滤器
    从Ftp下载某一文件夹下的所有文件(三)
    java操作Ftp文件的一些方式(一)
    Java代码实现FTP单个文件下载(二)
    一些order
    Spring Boot
    利用dubbo服务对传统工程的改造
  • 原文地址:https://www.cnblogs.com/my-king/p/11935391.html
Copyright © 2011-2022 走看看