Spring Transaction(spring事务)源码简析

核心接口:PlatformTransactionManager.java 还有其抽象类AbstractPlatformTransactionManager:
简述
Spring事务基础结构的中心接口。
代码详解
public interface PlatformTransactionManager {
    commit();
    rollback();
    beginTransaction();
}
 
AbstractPlatformTransactionManager继承了PlatformTransactionManager接口
简述
    实现PlatformTransactionManager基类的标准事务工作流,作为基础事务管理平台的基础如JtaTransactionManager。
    这个基础类提供了如下工作流处理:
    * 确定是否有事务
    * 应用对应的spring事务传播等级
    * 必要时对事务进行暂停(suspends)和恢复(resumes)
    * 提交时检查rollback-only标记(出错只能回滚)
    * 触发同步回调注册(如果事务同步是激活)
    子类继承当前抽象类需要实现begin, suspend, resume, commit, rollback.方法
    事务同步是一种通用机制,用于注册在事务完成时调用的回调。
    这个数据的内部访问主要用来支持运行在JTA事务的JDBC、Hibernate、JPA等,允许事务周期中重用相同会话的事务如Hibernate事务。
    可序列化,允许序列化事务策略以及携带事务拦截器的代理。这取决于子类是否想使他们状态可序列化,就应该实现Serializable接口标识和private 的readObject方法。
注:什么是JTA,主要用于处理分布式事务,实现两段式提交协议(ready、commit阶段)。
代码详解
  • 先看几个概念:
  • + 事务同步:两个事务操作相同表,后一个需要等待前一个
  • + empty事务:未找到含义,猜测是事务中无任何操作。
public abstract class AbstractPlatformTransactionManager implements PlatformTransactionManager, Serializable {
  //设置事务同步(默认)
    public static final int SYNCHRONIZATION_ALWAYS = 0;
    //设置事务同步(非空事务下才会才生效)
    public static final int SYNCHRONIZATION_ON_ACTUAL_TRANSACTION = 1;
     //设置事务不同步
    public static final int SYNCHRONIZATION_NEVER = 2;
    //AbstractPlatformTransactionManager的常量实例
    private static final Constants constants = new Constants(AbstractPlatformTransactionManager.class);
     //打log用的
    protected transient Log logger = LogFactory.getLog(getClass());
     //将事务同步级别默认设置为SYNCHRONIZATION_ALWAYS   --对应get/set方法
    private int transactionSynchronization = SYNCHRONIZATION_ALWAYS;
    //初始化默认超时时间为-1    --对应get/set方法
    private int defaultTimeout = TransactionDefinition.TIMEOUT_DEFAULT;
    //初始化默认不允许嵌套事务    --对应get/set方法
    private boolean nestedTransactionAllowed = false;
     //初始化默认在参与前不验证已存在的事务    --对应get/set方法
    private boolean validateExistingTransaction = false;
    //初始化默认事务失败后标记为rollback-only    --对应get/set方法
    private boolean globalRollbackOnParticipationFailure = true;
    //初始化默认事务失败后,不会尽早标记未rollback-readonly    --对应get/set方法
    private boolean failEarlyOnGlobalRollbackOnly = false;
    //初始化默认commit时候后不回滚    --对应get/set方法
    private boolean rollbackOnCommitFailure = false;
    ................................................................................................
     //根据传播等级获取对应的事务
    public final TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException {
        //doGetTransaction()是个钩子方法,由其子类进行实现如JtaTransactionManager、HibernateTransactionManager
        Object transaction = doGetTransaction();
        ....................
    }
    ..rollback()...
    ..commit()...
    ..............
}
 

然后在IDEA按 Ctrl+H 可以看到当前AbstractPlatformTransactionManager的上级继承体系:
 
Spring Transaction(spring事务)源码简析_第1张图片
 

然后看到DataSourceTransactionManager.java(继承AbstractPlatformTransactionManager):
 
    
TransactionDefinition.java:定义了事务传播性、隔离性等:
public interface TransactionDefinition {
int PROPAGATION_REQUIRED = 0;
。。。。。。。。。。。。。
 
Spring Transaction(spring事务)源码简析_第2张图片
 
 
jdbctemplate封装过程:
 
Spring Transaction(spring事务)源码简析_第3张图片
 
下面再来简单看一下DataSourceTransactionManager的代码:
org.springframework.jdbc.datasource.DataSourceTransactionManager:
 
Spring Transaction(spring事务)源码简析_第4张图片
 
DataSourceTransactionManager继承了AbstractPlatformTransactionManager抽象接口。并且重写了 doGetTransaction()方法如下:
@Override
protected Object doGetTransaction() {
    DataSourceTransactionObject txObject = new DataSourceTransactionObject();
    txObject.setSavepointAllowed(isNestedTransactionAllowed());  //isNestedTransactionAllowed()在当前实例初始化时被设置成true
    ConnectionHolder conHolder =
        (ConnectionHolder) TransactionSynchronizationManager.getResource(this.dataSource);
    txObject.setConnectionHolder(conHolder, false);
    return txObject;
}
 
1 其中doGetTransaction()是实现了模板方法模式,是AbstractPlatformTransactionManager的钩子,其在AbstractPlatformTransactionManager的位置如下:
 
 
 
由doGetTransaction()的
DataSourceTransactionObject txObject = new DataSourceTransactionObject();
 
Spring Transaction(spring事务)源码简析_第5张图片
 
主要涉及到的参数设置为"连接保持者对象(newConnectionHolder)"、"事务自动提交(mustRestoreAutoCommit)"、"是否可回滚(isRollbackOnly)"
 
ConnectionHolder参考链接: https://www.cnblogs.com/davenkin/archive/2013/02/23/java-tranaction-4.html
从上面我们看到这设置了"连接保持者对象",也就doGetTransaction()下面的设置代码如下:
ConnectionHolder conHolder =
    (ConnectionHolder) TransactionSynchronizationManager.getResource(this.dataSource);
txObject.setConnectionHolder(conHolder, false);
 
但什么是"连接保持者对象"?
 
Spring Transaction(spring事务)源码简析_第6张图片
 
直接实例化DataSourceTransactionManager如下:
    public DataSourceTransactionManager() { setNestedTransactionAllowed(true); }
以上代码会设置nestedTransactionAllowed = true
然后nestedTransactionAllowed在两个地方用到如下:
1) 获取事务的时候设置保存点
 
 
2)事务传播级别为PROPAGATION_NESTED时,必须为true判断校验
 
Spring Transaction(spring事务)源码简析_第7张图片
 
 
2 往下看DataSourceTransactionManager#isExistingTransaction(Object transaction)
@Override
protected boolean isExistingTransaction(Object transaction) {
    DataSourceTransactionObject txObject = (DataSourceTransactionObject) transaction;
    // 判断连接保持者是否为空或是否开启了事务
    return (txObject.getConnectionHolder() != null && txObject.getConnectionHolder().isTransactionActive());
}
 
Spring Transaction(spring事务)源码简析_第8张图片
 
这里设置自动提交由spring控制
 
Spring Transaction(spring事务)源码简析_第9张图片
 
 

你可能感兴趣的:(JAVA)