Spring事物04-源码分析TransactionDefinition

Spring事物源码分析-TransactionDefinition

一、TransactionDefinition接口

  • Spring事务中,通过TransactionDefinition接口定义了事物的属性,比如隔离级别、事务传播行为、事务超时时间、事务是否只读等。

  • TransactionDefinition中定义了事物传播级中的7个传播行为、4个事物隔离级别

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;
    //读未提交--1
	int ISOLATION_READ_UNCOMMITTED = Connection.TRANSACTION_READ_UNCOMMITTED;
    //读提交--2
	int ISOLATION_READ_COMMITTED = Connection.TRANSACTION_READ_COMMITTED;
    //可重复读--4
	int ISOLATION_REPEATABLE_READ = Connection.TRANSACTION_REPEATABLE_READ;
	//序列化--8
	int ISOLATION_SERIALIZABLE = Connection.TRANSACTION_SERIALIZABLE;

    //默认超时时间
	int TIMEOUT_DEFAULT = -1;

    //获取事物传播行为、隔离级别
	int getPropagationBehavior();
	int getIsolationLevel();
    
    //获取超时时间
	int getTimeout();
	//获取是否制只读
	boolean isReadOnly();
	//获取事物名称
	String getName();
}

二、子接口TransactionAttribute

  • TransactionAttribute是TransactionDefinition的子接口,该接口又添加了两个属性;
public interface TransactionAttribute extends TransactionDefinition {

	//事务的目标方法的完整方法名称
	@Nullable
	String getQualifier();

	//对于给定的异常信息,是否回滚
	boolean rollbackOn(Throwable ex);
}
  • 在事物调用之前,会通过事物属性源获取事物属性,在前面的《Spring事物03-源码分析TransactionInterceptor》中的invoke调用的invokeWithinTransaction方法中可以看到
	protected Object invokeWithinTransaction(Method method, @Nullable Class<?> targetClass,
			final InvocationCallback invocation) throws Throwable {
    //1.获取事物属性源,(如果为空则表示不存在事物)
	TransactionAttributeSource tas = getTransactionAttributeSource();
	//2.属性源得到目标类和方法有关的属性
	final TransactionAttribute txAttr = (tas != null ? tas.getTransactionAttribute(method, targetClass) : null);

    //省略其他......			    
}

三、实现类

3.1 DefaultTransactionDefinition

  • DefaultTransactionDefinition是TransactionDefinition的一个实现类,实现了一些比较基础的方法
public class DefaultTransactionDefinition implements TransactionDefinition, Serializable {

    //省略一些属性字段

	//很多重载的构造方法
	public DefaultTransactionDefinition() {
	}

	public DefaultTransactionDefinition(TransactionDefinition other) {
		this.propagationBehavior = other.getPropagationBehavior();
		this.isolationLevel = other.getIsolationLevel();
		this.timeout = other.getTimeout();
		this.readOnly = other.isReadOnly();
		this.name = other.getName();
	}

    //传播行为属性get set方法
	public final void setPropagationBehaviorName(String constantName) throws IllegalArgumentException {
		if (!constantName.startsWith(PREFIX_PROPAGATION)) {
			throw new IllegalArgumentException("Only propagation constants allowed");
		}
		setPropagationBehavior(constants.asNumber(constantName).intValue());
	}
	public final void setPropagationBehavior(int propagationBehavior) {
		if (!constants.getValues(PREFIX_PROPAGATION).contains(propagationBehavior)) {
			throw new IllegalArgumentException("Only values of propagation constants allowed");
		}
		this.propagationBehavior = propagationBehavior;
	} 
	public final int getPropagationBehavior() {
		return this.propagationBehavior;
	}

	//隔离级别get set方法
	public final void setIsolationLevelName(String constantName) throws IllegalArgumentException {
		if (!constantName.startsWith(PREFIX_ISOLATION)) {
			throw new IllegalArgumentException("Only isolation constants allowed");
		}
		setIsolationLevel(constants.asNumber(constantName).intValue());
	}
	public final void setIsolationLevel(int isolationLevel) {
		if (!constants.getValues(PREFIX_ISOLATION).contains(isolationLevel)) {
			throw new IllegalArgumentException("Only values of isolation constants allowed");
		}
		this.isolationLevel = isolationLevel;
	}
	@Override
	public final int getIsolationLevel() {
		return this.isolationLevel;
	}

	//超时get set方法
	public final void setTimeout(int timeout) {
		if (timeout < TIMEOUT_DEFAULT) {
			throw new IllegalArgumentException("Timeout must be a positive integer or TIMEOUT_DEFAULT");
		}
		this.timeout = timeout;
	}
	@Override
	public final int getTimeout() {
		return this.timeout;
	}

	//只读get set方法
	public final void setReadOnly(boolean readOnly) {
		this.readOnly = readOnly;
	}
	public final boolean isReadOnly() {
		return this.readOnly;
	}

	//name get set方法
	public final void setName(String name) {
		this.name = name;
	}
	public final String getName() {
		return this.name;
	}

    //省略equals和hashCode
	 
    //输出事物属性基本信息
	@Override
	public String toString() {
		return getDefinitionDescription().toString();
	}

    //输出事物属性基本信息
	protected final StringBuilder getDefinitionDescription() {
		//忽略..就是字符串输出...
	}
}

3.2 DefaultTransactionAttribute

  • DefaultTransactionAttribute实现了TransactionAttribute,并且继承了DefaultTransactionDefinition,几个类和接口的关系如下:

在这里插入图片描述

  • 实际上TransactionDefinition和TransactionAttribute接口是父子关系,而且前面也有描述,差异不大,两个实现类也是继承的关系,差异不大。

四、属性描述

4.1 事物传播

属性简化功能描述代码对应值备注
PROPAGATION_REQUIREDrequire有就加入,没有就创建0保证在同一个事务中
PROPAGATION_SUPPORTSsupports有就加入,没有就算了1保证在同一个事务中
PROPAGATION_MANDATORYmandatory有就加入,没有就抛异常2保证在同一个事务中
PROPAGATION_REQUIRES_NEWrequires_new前面有就挂起,自己一定要启动新的事物3保证不在一个事务中
PROPAGATION_NOT_SUPPORTEDnot_support前面有就挂起、自己不用事物4保证不在一个事务中
PROPAGATION_NEVERnever前面有要抛异常,以非事物方式运行5保证不在一个事务中
PROPAGATION_NESTEDnested当前存在事物则进行事物嵌套,事物可单独回滚或者提交,如果没有事物则和require行为一致6保证不在一个事务中

4.2 隔离级别

  • 事物隔离级别有四种
属性简化代码对应值
ISOLATION_DEFAULT默认,采用数据库的默认隔离级别-1
ISOLATION_READ_UNCOMMITTED读未提交1
ISOLATION_READ_COMMITTED读提交(Oracle默认)2
ISOLATION_REPEATABLE_READ可重复读(MySql默认)4
ISOLATION_SERIALIZABLE序列化8

五、小结

  • TransactionDefinition和TransactionAttribute接口是父子关系,而且差异不大;
  • DefaultTransactionDefinition和DefaultTransactionAttribute分别实现了前面的两个接口,而且差异也很小。
  • 两个接口或者实现类的作用都是用于描述一个事物的相关属性,也如文章开通所描述的,比如隔离级别、事务传播行为、事务超时时间、事务是否只读等。

六、参考

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring事务是Spring框架中非常重要的特性之一,它提供了对事务的管理和控制。在Spring中,事务的源码主要涉及到以下几个方面: 1. 事务管理器接口(PlatformTransactionManager):该接口定义了事务管理器的基本操作,如开启事务、提交事务、回滚事务等。不同的数据访问技术(如JDBC、Hibernate、JPA等)有不同的实现类。 2. 事务定义接口(TransactionDefinition):该接口定义了事务的属性,如隔离级别、传播行为、超时时间等。Spring中提供了多种事务定义的实现类,例如DefaultTransactionDefinition。 3. 事务状态接口(TransactionStatus):该接口定义了事务的状态信息,如是否处于活动状态、是否可以提交、是否可以回滚等。Spring中提供了多种事务状态的实现类,例如DefaultTransactionStatus。 4. 事务切面(TransactionAspectSupport):该类是Spring事务的核心类之一,它是一个抽象类,提供了对事务的具体实现。它通过AOP技术为带有@Transactional注解的方法创建代理对象,并在方法执行前后进行事务的开启、提交和回滚等操作。 5. 事务切面的通知类(TransactionInterceptor):该类是Spring事务的通知类之一,实现了MethodInterceptor接口。它负责在方法执行前后执行事务相关的逻辑,如开启事务、提交事务、回滚事务等。 以上是Spring事务源码的主要组成部分,通过对这些类的深入理解和研究,可以更好地掌握Spring事务的原理和实现机制。注意,这里只是简单介绍了一些关键的类和接口,实际上Spring事务的源码非常庞大且复杂。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值