zoukankan      html  css  js  c++  java
  • 【原创】spring中的事务传播特性

    关于spring的传播特性,我对其进行了详细的叙述了下:

    PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

    比如方法A调用方法B,如果方法A,B都使用该特性,那么A会开启事务,
    执行到B的时候,B发现自己处于一个事务中,则会合并到该事务中和
    A公用一个事务执行,弱任一异常会回滚整个事务,AB执行都失败。
    
    若A未开启事务且未使用该特性,B使用该特性,B发现未处于一
    个事务中,则会主动开启事务,只有B会使用事务,A不会。

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

    方法AB,A调用B,A使用REQUIRED,会开启事务,B,使用SUPPORTS,则B会加入A的事务,若A未使用事务,则B也不使用事务。

    PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。

    方法AB,A【REQUIRED】调用B【SUPPORTS】,A如果有事务,则B会加入事务,若A没有事务,B会报错,B必须加入一个显示存在的事务,自己不能开启事务。

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

    方法AB,A【REQUIRES_NEW】调用B【REQUIRES_NEW】,那么执行到B时,A事务会挂起,B会开启一个新的事务。A和B处于完全不同的两个事务之中。

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

    方法AB,A【REQUIRED】调用B【NOT_SUPPORTED】,B会挂起A事务,然后B不使用事务执行,也就是和A异步错开执行。

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

    不允许在事务内执行,否则抛出异常。

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

    A调用B,A【REQUIRED】调用B【NESTED】,此时B会作为嵌套事务开始执行,所谓嵌套事务,实际上就是加入A的事务和A使用一个事务,只是使用savepoint,如果B执行失败,会回滚到savepoint,然后A根据配置决定是回滚还是继续执行,这样就产生分支执行的情况。如B失败回滚,A可以在异常处理catch中继续未完成的操作。

    1.要设置 transactionManager nestedTransactionAllowed 属性为 true。

    2.

  • 相关阅读:
    My Vim
    POJ 3292 Semi-prime H-numbers
    洛谷P3954 成绩【民间数据】
    数据结构—栈/队列
    说服式设计(persuasive design)的行为模型
    发送邮件给某人:mailto标签
    如何识别和利用用户情绪
    HDU Good Numbers (热身赛2)
    atlas z 轴
    什么叫“默认邮件客户端没有正确安装”?
  • 原文地址:https://www.cnblogs.com/zhangxsh/p/3575441.html
Copyright © 2011-2022 走看看