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

    
    
  • 相关阅读:
    业务逻辑层封装
    了解ASP.NET MVC几种ActionResult的本质:EmptyResult & ContentResult
    Facade外观模式
    了解ASP.NET MVC几种ActionResult的本质:FileResult
    示例代码浏览器5.4功能更新
    面试体验:Microsoft 篇
    Mono 2.11.3 发布包含微软的 Entity Framework
    系统架构设计师
    对数据访问层的抽象中
    说说项目中的插件思想
  • 原文地址:https://www.cnblogs.com/my-king/p/11935391.html
Copyright © 2011-2022 走看看