文章目录

  • TransactionManager Diagram
    • 接口定义
      • getTransaction
      • TransactionDefinition
        • getPropagationBehavior
        • getIsolationLevel
        • isReadOnly
      • commit
      • rollback
    • Abstract帮助类
      • 属性
      • getTransaction
      • commit & rollback
    • 实现类R2dbcTransactionManager

TransactionManager Diagram

接口定义

这是一个空接口,既没有定义方法,也没有提供常量.这只是为了统一传统方式(PlatformTransactionManager)和reactive方式(ReactiveTransactionManager),这两个子接口类似,都是定义了三个,方法名和入参一致,只是返回值reactive的是Mono的类型


下面详细说下接口中对着三个方法的规定

getTransaction

这个接口用于获取一个transaction,可能是已有的,也可能是新增的.根据入参配置来.入参配置是一个接口,包含了配置项以及这个配置项范围,具体代码如下

TransactionDefinition

public interface TransactionDefinition {int PROPAGATION_REQUIRED = 0;int PROPAGATION_SUPPORTS = 1;int PROPAGATION_MANDATORY = 2;int PROPAGATION_REQUIRES_NEW = 3;int PROPAGATION_NOT_SUPPORTED = 4;int PROPAGATION_NEVER = 5;int PROPAGATION_NESTED = 6;int ISOLATION_DEFAULT = -1;int ISOLATION_READ_UNCOMMITTED = 1;  int ISOLATION_READ_COMMITTED = 2;  int ISOLATION_REPEATABLE_READ = 4;  int ISOLATION_SERIALIZABLE = 8;  int TIMEOUT_DEFAULT = -1;default int getPropagationBehavior() {return PROPAGATION_REQUIRED;}default int getIsolationLevel() {return ISOLATION_DEFAULT;}default int getTimeout() {return TIMEOUT_DEFAULT;}default boolean isReadOnly() {return false;}@Nullabledefault String getName() {return null;}static TransactionDefinition withDefaults() {return StaticTransactionDefinition.INSTANCE;}
}final class StaticTransactionDefinition implements TransactionDefinition {static final StaticTransactionDefinition INSTANCE = new StaticTransactionDefinition();private StaticTransactionDefinition() {}
}

getPropagationBehavior

这个是获取事务的传播方式,根据当前有无事务来采取不同的措施

当前有事务 当前无事务
PROPAGATION_REQUIRED 沿用 创建
PROPAGATION_SUPPORTS 沿用 不创建
PROPAGATION_MANDATORY 沿用 异常
PROPAGATION_REQUIRES_NEW 挂起后创建 创建
PROPAGATION_NOT_SUPPORTED
PROPAGATION_NEVER 异常 不创建
PROPAGATION_NESTED 创建内嵌 创建

对PropagationBehavior更进一步的研究可以参见SpringBoot中的Transaction研究(二)PropagationBehavior

getIsolationLevel

至于隔离级别是老生常谈,有兴趣的可以参见On Transaction系列
需要注意的是如果沿用了当前的事务,那么隔离级别这个配置是不会生效的

isReadOnly

这个是用于优化时的配置项,与其他配置项不同,如果不支持可以直接忽略,而对于其他配置项如果不支持则要抛异常.

commit

提交当前的事务,然后针对上面隔离级别采用不同的措施,例如恢复刚挂起的事务
需要注意的是commit也有可能失败,这个时候需要由TransactionManager自动rollback(或者无需rollback)

rollback

一般用于捕获异常后回滚,不包括commit的异常

Abstract帮助类

AbstractPlatformTransactionManager是一个帮助类,是PlatformTransactionManager的实现类,按照文档说明,建议自己实现PlatformTransactionManager的也继承这个抽象类,因为它已经解决了一个状态不对的问题,所以集成类只需要专心做doXXX即可。
另外还有一个AbstractReactiveTransactionManagerReactiveTransactionManager的实现类,其中代码差不多,只是使用了reactive的语法。

属性

AbstractPlatformTransactionManager里面有以下属性并且提供了getter和setter

 private int transactionSynchronization = SYNCHRONIZATION_ALWAYS;private int defaultTimeout = TransactionDefinition.TIMEOUT_DEFAULT;private boolean nestedTransactionAllowed = false;private boolean validateExistingTransaction = false;private boolean globalRollbackOnParticipationFailure = true;private boolean failEarlyOnGlobalRollbackOnly = false;private boolean rollbackOnCommitFailure = false;

getTransaction

抛开里面的默认值,整个对于不同类型的PropagationBehavior的调用不同的方法

#mermaid-svg-PdEVZtbG4bO3xgaL .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-PdEVZtbG4bO3xgaL .label text{fill:#333}#mermaid-svg-PdEVZtbG4bO3xgaL .node rect,#mermaid-svg-PdEVZtbG4bO3xgaL .node circle,#mermaid-svg-PdEVZtbG4bO3xgaL .node ellipse,#mermaid-svg-PdEVZtbG4bO3xgaL .node polygon,#mermaid-svg-PdEVZtbG4bO3xgaL .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-PdEVZtbG4bO3xgaL .node .label{text-align:center;fill:#333}#mermaid-svg-PdEVZtbG4bO3xgaL .node.clickable{cursor:pointer}#mermaid-svg-PdEVZtbG4bO3xgaL .arrowheadPath{fill:#333}#mermaid-svg-PdEVZtbG4bO3xgaL .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-PdEVZtbG4bO3xgaL .flowchart-link{stroke:#333;fill:none}#mermaid-svg-PdEVZtbG4bO3xgaL .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-PdEVZtbG4bO3xgaL .edgeLabel rect{opacity:0.9}#mermaid-svg-PdEVZtbG4bO3xgaL .edgeLabel span{color:#333}#mermaid-svg-PdEVZtbG4bO3xgaL .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-PdEVZtbG4bO3xgaL .cluster text{fill:#333}#mermaid-svg-PdEVZtbG4bO3xgaL div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-PdEVZtbG4bO3xgaL .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-PdEVZtbG4bO3xgaL text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-PdEVZtbG4bO3xgaL .actor-line{stroke:grey}#mermaid-svg-PdEVZtbG4bO3xgaL .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-PdEVZtbG4bO3xgaL .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-PdEVZtbG4bO3xgaL #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-PdEVZtbG4bO3xgaL .sequenceNumber{fill:#fff}#mermaid-svg-PdEVZtbG4bO3xgaL #sequencenumber{fill:#333}#mermaid-svg-PdEVZtbG4bO3xgaL #crosshead path{fill:#333;stroke:#333}#mermaid-svg-PdEVZtbG4bO3xgaL .messageText{fill:#333;stroke:#333}#mermaid-svg-PdEVZtbG4bO3xgaL .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-PdEVZtbG4bO3xgaL .labelText,#mermaid-svg-PdEVZtbG4bO3xgaL .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-PdEVZtbG4bO3xgaL .loopText,#mermaid-svg-PdEVZtbG4bO3xgaL .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-PdEVZtbG4bO3xgaL .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-PdEVZtbG4bO3xgaL .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-PdEVZtbG4bO3xgaL .noteText,#mermaid-svg-PdEVZtbG4bO3xgaL .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-PdEVZtbG4bO3xgaL .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-PdEVZtbG4bO3xgaL .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-PdEVZtbG4bO3xgaL .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-PdEVZtbG4bO3xgaL .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-PdEVZtbG4bO3xgaL .section{stroke:none;opacity:0.2}#mermaid-svg-PdEVZtbG4bO3xgaL .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-PdEVZtbG4bO3xgaL .section2{fill:#fff400}#mermaid-svg-PdEVZtbG4bO3xgaL .section1,#mermaid-svg-PdEVZtbG4bO3xgaL .section3{fill:#fff;opacity:0.2}#mermaid-svg-PdEVZtbG4bO3xgaL .sectionTitle0{fill:#333}#mermaid-svg-PdEVZtbG4bO3xgaL .sectionTitle1{fill:#333}#mermaid-svg-PdEVZtbG4bO3xgaL .sectionTitle2{fill:#333}#mermaid-svg-PdEVZtbG4bO3xgaL .sectionTitle3{fill:#333}#mermaid-svg-PdEVZtbG4bO3xgaL .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-PdEVZtbG4bO3xgaL .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-PdEVZtbG4bO3xgaL .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-PdEVZtbG4bO3xgaL .grid path{stroke-width:0}#mermaid-svg-PdEVZtbG4bO3xgaL .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-PdEVZtbG4bO3xgaL .task{stroke-width:2}#mermaid-svg-PdEVZtbG4bO3xgaL .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-PdEVZtbG4bO3xgaL .taskText:not([font-size]){font-size:11px}#mermaid-svg-PdEVZtbG4bO3xgaL .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-PdEVZtbG4bO3xgaL .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-PdEVZtbG4bO3xgaL .task.clickable{cursor:pointer}#mermaid-svg-PdEVZtbG4bO3xgaL .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-PdEVZtbG4bO3xgaL .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-PdEVZtbG4bO3xgaL .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-PdEVZtbG4bO3xgaL .taskText0,#mermaid-svg-PdEVZtbG4bO3xgaL .taskText1,#mermaid-svg-PdEVZtbG4bO3xgaL .taskText2,#mermaid-svg-PdEVZtbG4bO3xgaL .taskText3{fill:#fff}#mermaid-svg-PdEVZtbG4bO3xgaL .task0,#mermaid-svg-PdEVZtbG4bO3xgaL .task1,#mermaid-svg-PdEVZtbG4bO3xgaL .task2,#mermaid-svg-PdEVZtbG4bO3xgaL .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-PdEVZtbG4bO3xgaL .taskTextOutside0,#mermaid-svg-PdEVZtbG4bO3xgaL .taskTextOutside2{fill:#000}#mermaid-svg-PdEVZtbG4bO3xgaL .taskTextOutside1,#mermaid-svg-PdEVZtbG4bO3xgaL .taskTextOutside3{fill:#000}#mermaid-svg-PdEVZtbG4bO3xgaL .active0,#mermaid-svg-PdEVZtbG4bO3xgaL .active1,#mermaid-svg-PdEVZtbG4bO3xgaL .active2,#mermaid-svg-PdEVZtbG4bO3xgaL .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-PdEVZtbG4bO3xgaL .activeText0,#mermaid-svg-PdEVZtbG4bO3xgaL .activeText1,#mermaid-svg-PdEVZtbG4bO3xgaL .activeText2,#mermaid-svg-PdEVZtbG4bO3xgaL .activeText3{fill:#000 !important}#mermaid-svg-PdEVZtbG4bO3xgaL .done0,#mermaid-svg-PdEVZtbG4bO3xgaL .done1,#mermaid-svg-PdEVZtbG4bO3xgaL .done2,#mermaid-svg-PdEVZtbG4bO3xgaL .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-PdEVZtbG4bO3xgaL .doneText0,#mermaid-svg-PdEVZtbG4bO3xgaL .doneText1,#mermaid-svg-PdEVZtbG4bO3xgaL .doneText2,#mermaid-svg-PdEVZtbG4bO3xgaL .doneText3{fill:#000 !important}#mermaid-svg-PdEVZtbG4bO3xgaL .crit0,#mermaid-svg-PdEVZtbG4bO3xgaL .crit1,#mermaid-svg-PdEVZtbG4bO3xgaL .crit2,#mermaid-svg-PdEVZtbG4bO3xgaL .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-PdEVZtbG4bO3xgaL .activeCrit0,#mermaid-svg-PdEVZtbG4bO3xgaL .activeCrit1,#mermaid-svg-PdEVZtbG4bO3xgaL .activeCrit2,#mermaid-svg-PdEVZtbG4bO3xgaL .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-PdEVZtbG4bO3xgaL .doneCrit0,#mermaid-svg-PdEVZtbG4bO3xgaL .doneCrit1,#mermaid-svg-PdEVZtbG4bO3xgaL .doneCrit2,#mermaid-svg-PdEVZtbG4bO3xgaL .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-PdEVZtbG4bO3xgaL .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-PdEVZtbG4bO3xgaL .milestoneText{font-style:italic}#mermaid-svg-PdEVZtbG4bO3xgaL .doneCritText0,#mermaid-svg-PdEVZtbG4bO3xgaL .doneCritText1,#mermaid-svg-PdEVZtbG4bO3xgaL .doneCritText2,#mermaid-svg-PdEVZtbG4bO3xgaL .doneCritText3{fill:#000 !important}#mermaid-svg-PdEVZtbG4bO3xgaL .activeCritText0,#mermaid-svg-PdEVZtbG4bO3xgaL .activeCritText1,#mermaid-svg-PdEVZtbG4bO3xgaL .activeCritText2,#mermaid-svg-PdEVZtbG4bO3xgaL .activeCritText3{fill:#000 !important}#mermaid-svg-PdEVZtbG4bO3xgaL .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-PdEVZtbG4bO3xgaL g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-PdEVZtbG4bO3xgaL g.classGroup text .title{font-weight:bolder}#mermaid-svg-PdEVZtbG4bO3xgaL g.clickable{cursor:pointer}#mermaid-svg-PdEVZtbG4bO3xgaL g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-PdEVZtbG4bO3xgaL g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-PdEVZtbG4bO3xgaL .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-PdEVZtbG4bO3xgaL .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-PdEVZtbG4bO3xgaL .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-PdEVZtbG4bO3xgaL .dashed-line{stroke-dasharray:3}#mermaid-svg-PdEVZtbG4bO3xgaL #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-PdEVZtbG4bO3xgaL #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-PdEVZtbG4bO3xgaL #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-PdEVZtbG4bO3xgaL #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-PdEVZtbG4bO3xgaL #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-PdEVZtbG4bO3xgaL #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-PdEVZtbG4bO3xgaL #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-PdEVZtbG4bO3xgaL #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-PdEVZtbG4bO3xgaL .commit-id,#mermaid-svg-PdEVZtbG4bO3xgaL .commit-msg,#mermaid-svg-PdEVZtbG4bO3xgaL .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-PdEVZtbG4bO3xgaL .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-PdEVZtbG4bO3xgaL .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-PdEVZtbG4bO3xgaL g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-PdEVZtbG4bO3xgaL g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-PdEVZtbG4bO3xgaL g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-PdEVZtbG4bO3xgaL g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-PdEVZtbG4bO3xgaL g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-PdEVZtbG4bO3xgaL g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-PdEVZtbG4bO3xgaL .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-PdEVZtbG4bO3xgaL .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-PdEVZtbG4bO3xgaL .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-PdEVZtbG4bO3xgaL .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-PdEVZtbG4bO3xgaL .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-PdEVZtbG4bO3xgaL .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-PdEVZtbG4bO3xgaL .edgeLabel text{fill:#333}#mermaid-svg-PdEVZtbG4bO3xgaL .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-PdEVZtbG4bO3xgaL .node circle.state-start{fill:black;stroke:black}#mermaid-svg-PdEVZtbG4bO3xgaL .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-PdEVZtbG4bO3xgaL #statediagram-barbEnd{fill:#9370db}#mermaid-svg-PdEVZtbG4bO3xgaL .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-PdEVZtbG4bO3xgaL .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-PdEVZtbG4bO3xgaL .statediagram-state .divider{stroke:#9370db}#mermaid-svg-PdEVZtbG4bO3xgaL .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-PdEVZtbG4bO3xgaL .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-PdEVZtbG4bO3xgaL .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-PdEVZtbG4bO3xgaL .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-PdEVZtbG4bO3xgaL .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-PdEVZtbG4bO3xgaL .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-PdEVZtbG4bO3xgaL .note-edge{stroke-dasharray:5}#mermaid-svg-PdEVZtbG4bO3xgaL .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-PdEVZtbG4bO3xgaL .error-icon{fill:#522}#mermaid-svg-PdEVZtbG4bO3xgaL .error-text{fill:#522;stroke:#522}#mermaid-svg-PdEVZtbG4bO3xgaL .edge-thickness-normal{stroke-width:2px}#mermaid-svg-PdEVZtbG4bO3xgaL .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-PdEVZtbG4bO3xgaL .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-PdEVZtbG4bO3xgaL .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-PdEVZtbG4bO3xgaL .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-PdEVZtbG4bO3xgaL .marker{fill:#333}#mermaid-svg-PdEVZtbG4bO3xgaL .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-PdEVZtbG4bO3xgaL {color: rgba(0, 0, 0, 0.75);font: ;}

Y
N
NEVER
NOT_SUPPORTED
REQUIRES_NEW
NESTED
Y
N
Y
N
MANDATORY
REQUIRED,REQUIRES_NEW,NESTED
Other
Other
Y
N
begin
isExistingTransaction
getPropagationBehavior
getPropagationBehavior
throw Exception
prepareTransactionStatus
startTransaction
isNestedTransactionAllowed
useSavepointForNestedTransaction
isValidateExistingTransaction...

综上所述,最终结果出了抛出异常外就是startTransactionprepareTransactionStatus。这两个方法也很类似,第一步都是创建一个DefaultTransactionStatus对象作为返回值,最后一步都是通过调用*prepareSynchronization(DefaultTransactionStatus status, TransactionDefinition definition)*把相关参数设置到TransactionSynchronizationManager里面的ThreadLocal里。只是startTransaction还有额外的一步也就是它的第二步,调用了doBegin这个抽象方法。

commit & rollback

#mermaid-svg-MzLd90ibu8lTxerC .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-MzLd90ibu8lTxerC .label text{fill:#333}#mermaid-svg-MzLd90ibu8lTxerC .node rect,#mermaid-svg-MzLd90ibu8lTxerC .node circle,#mermaid-svg-MzLd90ibu8lTxerC .node ellipse,#mermaid-svg-MzLd90ibu8lTxerC .node polygon,#mermaid-svg-MzLd90ibu8lTxerC .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-MzLd90ibu8lTxerC .node .label{text-align:center;fill:#333}#mermaid-svg-MzLd90ibu8lTxerC .node.clickable{cursor:pointer}#mermaid-svg-MzLd90ibu8lTxerC .arrowheadPath{fill:#333}#mermaid-svg-MzLd90ibu8lTxerC .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-MzLd90ibu8lTxerC .flowchart-link{stroke:#333;fill:none}#mermaid-svg-MzLd90ibu8lTxerC .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-MzLd90ibu8lTxerC .edgeLabel rect{opacity:0.9}#mermaid-svg-MzLd90ibu8lTxerC .edgeLabel span{color:#333}#mermaid-svg-MzLd90ibu8lTxerC .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-MzLd90ibu8lTxerC .cluster text{fill:#333}#mermaid-svg-MzLd90ibu8lTxerC div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-MzLd90ibu8lTxerC .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-MzLd90ibu8lTxerC text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-MzLd90ibu8lTxerC .actor-line{stroke:grey}#mermaid-svg-MzLd90ibu8lTxerC .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-MzLd90ibu8lTxerC .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-MzLd90ibu8lTxerC #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-MzLd90ibu8lTxerC .sequenceNumber{fill:#fff}#mermaid-svg-MzLd90ibu8lTxerC #sequencenumber{fill:#333}#mermaid-svg-MzLd90ibu8lTxerC #crosshead path{fill:#333;stroke:#333}#mermaid-svg-MzLd90ibu8lTxerC .messageText{fill:#333;stroke:#333}#mermaid-svg-MzLd90ibu8lTxerC .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-MzLd90ibu8lTxerC .labelText,#mermaid-svg-MzLd90ibu8lTxerC .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-MzLd90ibu8lTxerC .loopText,#mermaid-svg-MzLd90ibu8lTxerC .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-MzLd90ibu8lTxerC .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-MzLd90ibu8lTxerC .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-MzLd90ibu8lTxerC .noteText,#mermaid-svg-MzLd90ibu8lTxerC .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-MzLd90ibu8lTxerC .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-MzLd90ibu8lTxerC .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-MzLd90ibu8lTxerC .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-MzLd90ibu8lTxerC .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-MzLd90ibu8lTxerC .section{stroke:none;opacity:0.2}#mermaid-svg-MzLd90ibu8lTxerC .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-MzLd90ibu8lTxerC .section2{fill:#fff400}#mermaid-svg-MzLd90ibu8lTxerC .section1,#mermaid-svg-MzLd90ibu8lTxerC .section3{fill:#fff;opacity:0.2}#mermaid-svg-MzLd90ibu8lTxerC .sectionTitle0{fill:#333}#mermaid-svg-MzLd90ibu8lTxerC .sectionTitle1{fill:#333}#mermaid-svg-MzLd90ibu8lTxerC .sectionTitle2{fill:#333}#mermaid-svg-MzLd90ibu8lTxerC .sectionTitle3{fill:#333}#mermaid-svg-MzLd90ibu8lTxerC .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-MzLd90ibu8lTxerC .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-MzLd90ibu8lTxerC .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-MzLd90ibu8lTxerC .grid path{stroke-width:0}#mermaid-svg-MzLd90ibu8lTxerC .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-MzLd90ibu8lTxerC .task{stroke-width:2}#mermaid-svg-MzLd90ibu8lTxerC .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-MzLd90ibu8lTxerC .taskText:not([font-size]){font-size:11px}#mermaid-svg-MzLd90ibu8lTxerC .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-MzLd90ibu8lTxerC .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-MzLd90ibu8lTxerC .task.clickable{cursor:pointer}#mermaid-svg-MzLd90ibu8lTxerC .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-MzLd90ibu8lTxerC .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-MzLd90ibu8lTxerC .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-MzLd90ibu8lTxerC .taskText0,#mermaid-svg-MzLd90ibu8lTxerC .taskText1,#mermaid-svg-MzLd90ibu8lTxerC .taskText2,#mermaid-svg-MzLd90ibu8lTxerC .taskText3{fill:#fff}#mermaid-svg-MzLd90ibu8lTxerC .task0,#mermaid-svg-MzLd90ibu8lTxerC .task1,#mermaid-svg-MzLd90ibu8lTxerC .task2,#mermaid-svg-MzLd90ibu8lTxerC .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-MzLd90ibu8lTxerC .taskTextOutside0,#mermaid-svg-MzLd90ibu8lTxerC .taskTextOutside2{fill:#000}#mermaid-svg-MzLd90ibu8lTxerC .taskTextOutside1,#mermaid-svg-MzLd90ibu8lTxerC .taskTextOutside3{fill:#000}#mermaid-svg-MzLd90ibu8lTxerC .active0,#mermaid-svg-MzLd90ibu8lTxerC .active1,#mermaid-svg-MzLd90ibu8lTxerC .active2,#mermaid-svg-MzLd90ibu8lTxerC .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-MzLd90ibu8lTxerC .activeText0,#mermaid-svg-MzLd90ibu8lTxerC .activeText1,#mermaid-svg-MzLd90ibu8lTxerC .activeText2,#mermaid-svg-MzLd90ibu8lTxerC .activeText3{fill:#000 !important}#mermaid-svg-MzLd90ibu8lTxerC .done0,#mermaid-svg-MzLd90ibu8lTxerC .done1,#mermaid-svg-MzLd90ibu8lTxerC .done2,#mermaid-svg-MzLd90ibu8lTxerC .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-MzLd90ibu8lTxerC .doneText0,#mermaid-svg-MzLd90ibu8lTxerC .doneText1,#mermaid-svg-MzLd90ibu8lTxerC .doneText2,#mermaid-svg-MzLd90ibu8lTxerC .doneText3{fill:#000 !important}#mermaid-svg-MzLd90ibu8lTxerC .crit0,#mermaid-svg-MzLd90ibu8lTxerC .crit1,#mermaid-svg-MzLd90ibu8lTxerC .crit2,#mermaid-svg-MzLd90ibu8lTxerC .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-MzLd90ibu8lTxerC .activeCrit0,#mermaid-svg-MzLd90ibu8lTxerC .activeCrit1,#mermaid-svg-MzLd90ibu8lTxerC .activeCrit2,#mermaid-svg-MzLd90ibu8lTxerC .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-MzLd90ibu8lTxerC .doneCrit0,#mermaid-svg-MzLd90ibu8lTxerC .doneCrit1,#mermaid-svg-MzLd90ibu8lTxerC .doneCrit2,#mermaid-svg-MzLd90ibu8lTxerC .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-MzLd90ibu8lTxerC .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-MzLd90ibu8lTxerC .milestoneText{font-style:italic}#mermaid-svg-MzLd90ibu8lTxerC .doneCritText0,#mermaid-svg-MzLd90ibu8lTxerC .doneCritText1,#mermaid-svg-MzLd90ibu8lTxerC .doneCritText2,#mermaid-svg-MzLd90ibu8lTxerC .doneCritText3{fill:#000 !important}#mermaid-svg-MzLd90ibu8lTxerC .activeCritText0,#mermaid-svg-MzLd90ibu8lTxerC .activeCritText1,#mermaid-svg-MzLd90ibu8lTxerC .activeCritText2,#mermaid-svg-MzLd90ibu8lTxerC .activeCritText3{fill:#000 !important}#mermaid-svg-MzLd90ibu8lTxerC .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-MzLd90ibu8lTxerC g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-MzLd90ibu8lTxerC g.classGroup text .title{font-weight:bolder}#mermaid-svg-MzLd90ibu8lTxerC g.clickable{cursor:pointer}#mermaid-svg-MzLd90ibu8lTxerC g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-MzLd90ibu8lTxerC g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-MzLd90ibu8lTxerC .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-MzLd90ibu8lTxerC .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-MzLd90ibu8lTxerC .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-MzLd90ibu8lTxerC .dashed-line{stroke-dasharray:3}#mermaid-svg-MzLd90ibu8lTxerC #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-MzLd90ibu8lTxerC #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-MzLd90ibu8lTxerC #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-MzLd90ibu8lTxerC #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-MzLd90ibu8lTxerC #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-MzLd90ibu8lTxerC #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-MzLd90ibu8lTxerC #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-MzLd90ibu8lTxerC #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-MzLd90ibu8lTxerC .commit-id,#mermaid-svg-MzLd90ibu8lTxerC .commit-msg,#mermaid-svg-MzLd90ibu8lTxerC .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-MzLd90ibu8lTxerC .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-MzLd90ibu8lTxerC .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-MzLd90ibu8lTxerC g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-MzLd90ibu8lTxerC g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-MzLd90ibu8lTxerC g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-MzLd90ibu8lTxerC g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-MzLd90ibu8lTxerC g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-MzLd90ibu8lTxerC g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-MzLd90ibu8lTxerC .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-MzLd90ibu8lTxerC .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-MzLd90ibu8lTxerC .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-MzLd90ibu8lTxerC .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-MzLd90ibu8lTxerC .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-MzLd90ibu8lTxerC .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-MzLd90ibu8lTxerC .edgeLabel text{fill:#333}#mermaid-svg-MzLd90ibu8lTxerC .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-MzLd90ibu8lTxerC .node circle.state-start{fill:black;stroke:black}#mermaid-svg-MzLd90ibu8lTxerC .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-MzLd90ibu8lTxerC #statediagram-barbEnd{fill:#9370db}#mermaid-svg-MzLd90ibu8lTxerC .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-MzLd90ibu8lTxerC .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-MzLd90ibu8lTxerC .statediagram-state .divider{stroke:#9370db}#mermaid-svg-MzLd90ibu8lTxerC .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-MzLd90ibu8lTxerC .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-MzLd90ibu8lTxerC .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-MzLd90ibu8lTxerC .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-MzLd90ibu8lTxerC .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-MzLd90ibu8lTxerC .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-MzLd90ibu8lTxerC .note-edge{stroke-dasharray:5}#mermaid-svg-MzLd90ibu8lTxerC .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-MzLd90ibu8lTxerC .error-icon{fill:#522}#mermaid-svg-MzLd90ibu8lTxerC .error-text{fill:#522;stroke:#522}#mermaid-svg-MzLd90ibu8lTxerC .edge-thickness-normal{stroke-width:2px}#mermaid-svg-MzLd90ibu8lTxerC .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-MzLd90ibu8lTxerC .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-MzLd90ibu8lTxerC .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-MzLd90ibu8lTxerC .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-MzLd90ibu8lTxerC .marker{fill:#333}#mermaid-svg-MzLd90ibu8lTxerC .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-MzLd90ibu8lTxerC {color: rgba(0, 0, 0, 0.75);font: ;}

Y
N
isLocalRollbackOnly
commit
status.isCompleted
throw Exception
config
processRollback
!shouldCommitOnGlobalRollbackOnly&defStatus.isGlobalRollbackOnly
processRollback
else
processCommit
rollback

通过上面的图可以看出来最终也是走向了processCommitprocessRollback这两个方法。我们清除里面的记录日志的代码后结果如下

#mermaid-svg-NT5lES69ob8jnBC2 .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-NT5lES69ob8jnBC2 .label text{fill:#333}#mermaid-svg-NT5lES69ob8jnBC2 .node rect,#mermaid-svg-NT5lES69ob8jnBC2 .node circle,#mermaid-svg-NT5lES69ob8jnBC2 .node ellipse,#mermaid-svg-NT5lES69ob8jnBC2 .node polygon,#mermaid-svg-NT5lES69ob8jnBC2 .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-NT5lES69ob8jnBC2 .node .label{text-align:center;fill:#333}#mermaid-svg-NT5lES69ob8jnBC2 .node.clickable{cursor:pointer}#mermaid-svg-NT5lES69ob8jnBC2 .arrowheadPath{fill:#333}#mermaid-svg-NT5lES69ob8jnBC2 .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-NT5lES69ob8jnBC2 .flowchart-link{stroke:#333;fill:none}#mermaid-svg-NT5lES69ob8jnBC2 .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-NT5lES69ob8jnBC2 .edgeLabel rect{opacity:0.9}#mermaid-svg-NT5lES69ob8jnBC2 .edgeLabel span{color:#333}#mermaid-svg-NT5lES69ob8jnBC2 .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-NT5lES69ob8jnBC2 .cluster text{fill:#333}#mermaid-svg-NT5lES69ob8jnBC2 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-NT5lES69ob8jnBC2 .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-NT5lES69ob8jnBC2 text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-NT5lES69ob8jnBC2 .actor-line{stroke:grey}#mermaid-svg-NT5lES69ob8jnBC2 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-NT5lES69ob8jnBC2 .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-NT5lES69ob8jnBC2 #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-NT5lES69ob8jnBC2 .sequenceNumber{fill:#fff}#mermaid-svg-NT5lES69ob8jnBC2 #sequencenumber{fill:#333}#mermaid-svg-NT5lES69ob8jnBC2 #crosshead path{fill:#333;stroke:#333}#mermaid-svg-NT5lES69ob8jnBC2 .messageText{fill:#333;stroke:#333}#mermaid-svg-NT5lES69ob8jnBC2 .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-NT5lES69ob8jnBC2 .labelText,#mermaid-svg-NT5lES69ob8jnBC2 .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-NT5lES69ob8jnBC2 .loopText,#mermaid-svg-NT5lES69ob8jnBC2 .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-NT5lES69ob8jnBC2 .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-NT5lES69ob8jnBC2 .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-NT5lES69ob8jnBC2 .noteText,#mermaid-svg-NT5lES69ob8jnBC2 .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-NT5lES69ob8jnBC2 .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-NT5lES69ob8jnBC2 .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-NT5lES69ob8jnBC2 .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-NT5lES69ob8jnBC2 .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-NT5lES69ob8jnBC2 .section{stroke:none;opacity:0.2}#mermaid-svg-NT5lES69ob8jnBC2 .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-NT5lES69ob8jnBC2 .section2{fill:#fff400}#mermaid-svg-NT5lES69ob8jnBC2 .section1,#mermaid-svg-NT5lES69ob8jnBC2 .section3{fill:#fff;opacity:0.2}#mermaid-svg-NT5lES69ob8jnBC2 .sectionTitle0{fill:#333}#mermaid-svg-NT5lES69ob8jnBC2 .sectionTitle1{fill:#333}#mermaid-svg-NT5lES69ob8jnBC2 .sectionTitle2{fill:#333}#mermaid-svg-NT5lES69ob8jnBC2 .sectionTitle3{fill:#333}#mermaid-svg-NT5lES69ob8jnBC2 .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-NT5lES69ob8jnBC2 .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-NT5lES69ob8jnBC2 .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-NT5lES69ob8jnBC2 .grid path{stroke-width:0}#mermaid-svg-NT5lES69ob8jnBC2 .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-NT5lES69ob8jnBC2 .task{stroke-width:2}#mermaid-svg-NT5lES69ob8jnBC2 .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-NT5lES69ob8jnBC2 .taskText:not([font-size]){font-size:11px}#mermaid-svg-NT5lES69ob8jnBC2 .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-NT5lES69ob8jnBC2 .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-NT5lES69ob8jnBC2 .task.clickable{cursor:pointer}#mermaid-svg-NT5lES69ob8jnBC2 .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-NT5lES69ob8jnBC2 .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-NT5lES69ob8jnBC2 .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-NT5lES69ob8jnBC2 .taskText0,#mermaid-svg-NT5lES69ob8jnBC2 .taskText1,#mermaid-svg-NT5lES69ob8jnBC2 .taskText2,#mermaid-svg-NT5lES69ob8jnBC2 .taskText3{fill:#fff}#mermaid-svg-NT5lES69ob8jnBC2 .task0,#mermaid-svg-NT5lES69ob8jnBC2 .task1,#mermaid-svg-NT5lES69ob8jnBC2 .task2,#mermaid-svg-NT5lES69ob8jnBC2 .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-NT5lES69ob8jnBC2 .taskTextOutside0,#mermaid-svg-NT5lES69ob8jnBC2 .taskTextOutside2{fill:#000}#mermaid-svg-NT5lES69ob8jnBC2 .taskTextOutside1,#mermaid-svg-NT5lES69ob8jnBC2 .taskTextOutside3{fill:#000}#mermaid-svg-NT5lES69ob8jnBC2 .active0,#mermaid-svg-NT5lES69ob8jnBC2 .active1,#mermaid-svg-NT5lES69ob8jnBC2 .active2,#mermaid-svg-NT5lES69ob8jnBC2 .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-NT5lES69ob8jnBC2 .activeText0,#mermaid-svg-NT5lES69ob8jnBC2 .activeText1,#mermaid-svg-NT5lES69ob8jnBC2 .activeText2,#mermaid-svg-NT5lES69ob8jnBC2 .activeText3{fill:#000 !important}#mermaid-svg-NT5lES69ob8jnBC2 .done0,#mermaid-svg-NT5lES69ob8jnBC2 .done1,#mermaid-svg-NT5lES69ob8jnBC2 .done2,#mermaid-svg-NT5lES69ob8jnBC2 .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-NT5lES69ob8jnBC2 .doneText0,#mermaid-svg-NT5lES69ob8jnBC2 .doneText1,#mermaid-svg-NT5lES69ob8jnBC2 .doneText2,#mermaid-svg-NT5lES69ob8jnBC2 .doneText3{fill:#000 !important}#mermaid-svg-NT5lES69ob8jnBC2 .crit0,#mermaid-svg-NT5lES69ob8jnBC2 .crit1,#mermaid-svg-NT5lES69ob8jnBC2 .crit2,#mermaid-svg-NT5lES69ob8jnBC2 .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-NT5lES69ob8jnBC2 .activeCrit0,#mermaid-svg-NT5lES69ob8jnBC2 .activeCrit1,#mermaid-svg-NT5lES69ob8jnBC2 .activeCrit2,#mermaid-svg-NT5lES69ob8jnBC2 .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-NT5lES69ob8jnBC2 .doneCrit0,#mermaid-svg-NT5lES69ob8jnBC2 .doneCrit1,#mermaid-svg-NT5lES69ob8jnBC2 .doneCrit2,#mermaid-svg-NT5lES69ob8jnBC2 .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-NT5lES69ob8jnBC2 .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-NT5lES69ob8jnBC2 .milestoneText{font-style:italic}#mermaid-svg-NT5lES69ob8jnBC2 .doneCritText0,#mermaid-svg-NT5lES69ob8jnBC2 .doneCritText1,#mermaid-svg-NT5lES69ob8jnBC2 .doneCritText2,#mermaid-svg-NT5lES69ob8jnBC2 .doneCritText3{fill:#000 !important}#mermaid-svg-NT5lES69ob8jnBC2 .activeCritText0,#mermaid-svg-NT5lES69ob8jnBC2 .activeCritText1,#mermaid-svg-NT5lES69ob8jnBC2 .activeCritText2,#mermaid-svg-NT5lES69ob8jnBC2 .activeCritText3{fill:#000 !important}#mermaid-svg-NT5lES69ob8jnBC2 .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-NT5lES69ob8jnBC2 g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-NT5lES69ob8jnBC2 g.classGroup text .title{font-weight:bolder}#mermaid-svg-NT5lES69ob8jnBC2 g.clickable{cursor:pointer}#mermaid-svg-NT5lES69ob8jnBC2 g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-NT5lES69ob8jnBC2 g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-NT5lES69ob8jnBC2 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-NT5lES69ob8jnBC2 .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-NT5lES69ob8jnBC2 .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-NT5lES69ob8jnBC2 .dashed-line{stroke-dasharray:3}#mermaid-svg-NT5lES69ob8jnBC2 #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-NT5lES69ob8jnBC2 #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-NT5lES69ob8jnBC2 #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-NT5lES69ob8jnBC2 #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-NT5lES69ob8jnBC2 #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-NT5lES69ob8jnBC2 #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-NT5lES69ob8jnBC2 #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-NT5lES69ob8jnBC2 #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-NT5lES69ob8jnBC2 .commit-id,#mermaid-svg-NT5lES69ob8jnBC2 .commit-msg,#mermaid-svg-NT5lES69ob8jnBC2 .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-NT5lES69ob8jnBC2 .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-NT5lES69ob8jnBC2 .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-NT5lES69ob8jnBC2 g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-NT5lES69ob8jnBC2 g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-NT5lES69ob8jnBC2 g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-NT5lES69ob8jnBC2 g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-NT5lES69ob8jnBC2 g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-NT5lES69ob8jnBC2 g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-NT5lES69ob8jnBC2 .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-NT5lES69ob8jnBC2 .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-NT5lES69ob8jnBC2 .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-NT5lES69ob8jnBC2 .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-NT5lES69ob8jnBC2 .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-NT5lES69ob8jnBC2 .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-NT5lES69ob8jnBC2 .edgeLabel text{fill:#333}#mermaid-svg-NT5lES69ob8jnBC2 .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-NT5lES69ob8jnBC2 .node circle.state-start{fill:black;stroke:black}#mermaid-svg-NT5lES69ob8jnBC2 .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-NT5lES69ob8jnBC2 #statediagram-barbEnd{fill:#9370db}#mermaid-svg-NT5lES69ob8jnBC2 .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-NT5lES69ob8jnBC2 .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-NT5lES69ob8jnBC2 .statediagram-state .divider{stroke:#9370db}#mermaid-svg-NT5lES69ob8jnBC2 .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-NT5lES69ob8jnBC2 .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-NT5lES69ob8jnBC2 .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-NT5lES69ob8jnBC2 .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-NT5lES69ob8jnBC2 .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-NT5lES69ob8jnBC2 .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-NT5lES69ob8jnBC2 .note-edge{stroke-dasharray:5}#mermaid-svg-NT5lES69ob8jnBC2 .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-NT5lES69ob8jnBC2 .error-icon{fill:#522}#mermaid-svg-NT5lES69ob8jnBC2 .error-text{fill:#522;stroke:#522}#mermaid-svg-NT5lES69ob8jnBC2 .edge-thickness-normal{stroke-width:2px}#mermaid-svg-NT5lES69ob8jnBC2 .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-NT5lES69ob8jnBC2 .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-NT5lES69ob8jnBC2 .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-NT5lES69ob8jnBC2 .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-NT5lES69ob8jnBC2 .marker{fill:#333}#mermaid-svg-NT5lES69ob8jnBC2 .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-NT5lES69ob8jnBC2 {color: rgba(0, 0, 0, 0.75);font: ;}processCommitAbstractPlatformTransactionManagerTransactionSynchronizationUtilsTransactionSynchronizationimplprepareForCommitvoidtriggerBeforeCommittriggerBeforeCommitbeforeCommitvoidloop[every synchronization]voidopt[status isNewSynchronization]voidtriggerBeforeCompletiontriggerBeforeCompletionbeforeCompletionvoidloop[every synchronization]voidopt[status isNewSynchronization]voiddoCommitvoidopt[status isNewTransaction]triggerAfterCompletioninvokeAfterCompletionafterCompletionvoidloop[every synchronization]voidinvokeAfterCompletionafterCompletionvoidloop[every synchronization]voidalt[!status.hasTransaction ||status.isNewTransaction][!synchronizations.isEmpty]alt[status isNewSynchronization]voidtriggerAfterCompletionvoidtriggerBeforeCompletionvoidopt[!beforeCompletionInvoked]doRollbackOnCommitExceptiondoRollbackvoiddoSetRollbackOnlyvoidalt[status.isNewTransaction][status.hasTransaction]triggerAfterCompletionvoidalt[UNEXPECTED_ROLLBACK][TRANSACTION_EXCEPTION][RUNTIME_OR_ERROR]triggerAfterCommitvoidcleanupAfterCompletionvoidtriggerAfterCompletionvoidprocessCommitAbstractPlatformTransactionManagerTransactionSynchronizationUtilsTransactionSynchronizationimpl

实现类R2dbcTransactionManager

这个实现类里实现了各种doXXX,其中doCommit和doRollback都是通过得到Connection然后调用相应方法来实现,而doSetRollbackOnly是通过status得到ConnectionFactoryTransactionObject然后调用其setRollbackOnly来实现

SpringBoot中的Transaction研究(一)TransactionManager相关推荐

  1. SpringBoot学习笔记(9)----SpringBoot中使用关系型数据库以及事务处理

    在实际的运用开发中,跟数据库之间的交互是必不可少的,SpringBoot也提供了两种跟数据库交互的方式. 1. 使用JdbcTemplate 在SpringBoot中提供了JdbcTemplate模板 ...

  2. SpringBoot中使用redis事务

    本文基于SpringBoot 2.X 事务在关系型数据库的开发中经常用到,其实非关系型数据库,比如redis也有对事务的支持,本文主要探讨在SpringBoot中如何使用redis事务. 事务的相关介 ...

  3. SpringBoot中事务执行原理分析(一)

    关联博文: SpringBoot中事务执行原理分析(一) SpringBoot中事务执行原理分析(二) SpringBoot中事务执行原理分析(三) SpringBoot中事务执行原理分析(四) Sp ...

  4. J2EE学习中一些值得研究的开源项目(转载天极网)

    J2EE学习中一些值得研究的开源项目 这篇文章写在我研究J2SE.J2EE近三年后.前3年我研究了J2SE的Swing.Applet.Net.RMI.Collections.IO.JNI--研究了J2 ...

  5. SpringBoot中使用hikariCP

    本篇文章主要实现SpringBoot中使用hikariCP:  一 .使用工具  1. JDK1.8  2. springToolSuit(STS)  3. maven  二.创建项目  1.首先创建 ...

  6. 全局性事务控制如何在springboot中配置

    开发中,我们一般会利用AOP配置全局性的事务,对指定包下指定的方法(如add,update等)进行事务控制,在springboot中如何实现呢? @EnableTransactionManagemen ...

  7. 面试官 | SpringBoot 中如何实现异步请求和异步调用?

    作者 | 会炼钢的小白龙 来源 | cnblogs.com/baixianlong/p/10661591.html 一.SpringBoot中异步请求的使用 1.异步请求与同步请求 特点: 可以先释放 ...

  8. SpringBoot中AOP实现落地——Filter(过滤器)、Intercepter(拦截器)、Aspect(Spring AOP)

    文章目录 一.一切要从Servlet说起 1.1什么是Servlet 1.2为什么需要Servlet 1.3Servlet如何响应用户请求 1.4Servlet与Tomcat处理请求的流程 1.5Se ...

  9. spring boot 事务_Redis 事务在 SpringBoot 中的应用

    环境信息 JDK 版本信息 <properties><java.version>1.8</java.version> </properties> Spr ...

最新文章

  1. 导师发现我刷短视频,给我发了一条链接
  2. salt-ssh 安装salt-minion 笔记
  3. jQuery unbind 删除绑定事件 / 移除标签方法
  4. Java print流简介
  5. java更新无法正常安装_Java无法安装
  6. svm多分类代码_监督学习——分类算法I
  7. java 析构函数_C++虚函数
  8. 台式机鼠标失灵打开计算机,台式电脑鼠标不动了怎么办
  9. 打造最舒适的webview调试环境 1
  10. android eclipse下载
  11. [php]laravel框架容器管理的一些要点
  12. 美媒:马斯克已掌管推特 立即开除CEO、CFO,新CEO据传是曾经卖牛肉的中国人
  13. 单播、多播(组播)和广播的区别
  14. svm多分类python代码_SVM算法的理解及其Python实现多分类和二分类
  15. 手把手教你DosBox的配置(附下载资源)
  16. 同一个二维码支持多种支付的实现思路
  17. 【深圳居住证】2021免费网上快速办理(超详细图文详解)
  18. 显示器分辨率一直跳_常见屏幕比例与显示器分辨率详解
  19. 如何打断制图中的CAD图形?
  20. 花拳绣腿的「融360」:金融AI第一股今安在?|| 新芒X

热门文章

  1. 关于maven的java面试题汇总
  2. JavaFx+Jfoenix
  3. 微生物全基因组测序分子分型技术在食源性疾病中的应用
  4. C++Socket接口编程
  5. EXCEL 提取 多次重复特定字符的文本,提取单元格重复出现最后一个括号的内容
  6. 有什么工具可以上载复杂的 excel 数据填报到数据库中
  7. FPGA电机控制源码(verilog+nios2架构)FPG FPGA电机控制源码(verilog+nios2架构)FPGA电机控制源码
  8. EE302 - Lab 5
  9. 利用Python将图片序列转换成视频
  10. 【IEEE Xplore、EI、Scopus】第三届信息科学、电气与自动化工程国际学术会议(ISEAE 2021)