Spring事务相关接口以及实现类

目标

为后续分析事务源码前做一个介绍,有些属性可能光看这个依然看不懂,当看下篇文章Spring事务源码分析的时候就知道了。

PlatformTransactionManager

/**
 * Spring事务抽象的顶级接口
 * 以下所说的具体行为以DataSourceTransactionManager这个实现类为准
 */
public interface PlatformTransactionManager {

    /**
     * 开启一个事务, 即从给定的数据源中获取一个连接,关闭自动提交模式,并且将连接绑定到当前线程
     * 并且使用给定的参数设置连接的一些行为(隔离级别, 事务只读特性)
     * 如果指定的隔离级别不需要事务,那么开启一个空事务,也不会从数据源中获取连接,绑定连接到线程
     * @Param definition 定义了事务的一些特征,如传播行为,隔离级别等。
     */
    TransactionStatus getTransaction(TransactionDefinition definition);

    /**
     * 提交一个事务
     */
    void commit(TransactionStatus status);

    /**
     * 回滚一个事务
     */
    void rollback(TransactionStatus status);

}

TransactionDefinition

此接口主要用来定义事务的一些属性(传播行为、隔离级别、事务超时时间、事务只读),接口中定义了一组get方法来获取这些属性,并且定义了7个传播行为。

  • PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务,如果当前不存在事务,则创建一个新的事务。
  • PROPAGATION_SUPPORTS:如果当前存在事务,则加入事务,如果当前不存在事务,则以非事务运行。
  • PROPAGATION_MANDATORY:强制当前必须存在一个事务,在该事务中运行,否则抛出异常。
  • PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在一个事务,挂起当前事务,这两个事务不相干。
  • PROPAGATION_NOT_SUPPORTED:不支持事务,总是以非事务运行,如果当前存在事务,挂起当前事务,获取一个新的连接来执行。
  • PROPAGATION_NEVER:不支持事务,如果存在事务则抛出异常。
  • PROPAGATION_NESTED:嵌套事务,如果当前不存在事务,则行为与PROPAGATION_REQUIRED一致。采用JDBC的保存点(Savepoint)实现。

DefaultTransactionDefinition是一个默认的实现类,传播行为默认为PROPAGATION_REQUIRED,隔离级别默认采用数据库设置的隔离级别,只读默认为false。

TransactionStatus

/**
 * 此接口定义事务的状态,此接口获取的值会影响commit和rollback的行为。
 */
public interface TransactionStatus extends SavepointManager, Flushable {

    /**
     * 判断此事务是不是一个新的事务,因为受传播行为影响,会参与到一个已经存在的事务
     * 那么结果就不是一个新事务。
     */
    boolean isNewTransaction();

    /**
     * 判断是否有保存点(嵌套事务使用)
     */
    boolean hasSavepoint();

    /**
     * 设置该事务的结果只有回滚这一行为,当设置为true后,即便调用commit方法也会发生回滚。
     */
    void setRollbackOnly();
    boolean isRollbackOnly();

    /**
     * 事务是否完成,事务提交或者回滚后,事务就完成了。
     */
    boolean isCompleted();

}

DefaultTransactionStatus

public abstract class AbstractTransactionStatus implements TransactionStatus {

    /**
     * 设置为true,那么事务只会有一种结果那就是回滚
     * 设置了此属性,即使调用commit也会执行回滚
     */
    private boolean rollbackOnly = false;

    /**
     * 事务状态
     */
    private boolean completed = false;

    /**
     * 保存点, 用于嵌套事务
     */
    private Object savepoint;
}

public class DefaultTransactionStatus extends AbstractTransactionStatus {

    /**
     * 代表一个事务对象
     * DataSourceTransactionManager事务管理器使用的是其内部类DataSourceTransactionObject
     */
    private final Object transaction;

    /**
     * 代表是不是一个新事务(空事务或真实存在的事务)
     * 注: 值为true时不代表开启一个真实存在的事务
     * 当指定事务传播行为以非事务方式运行的时候,Spring也会将这个值置为true,但是transaction为null
     * 以下几种情况newTransaction = true
     * 1. 开启一个真实存在的事务,必须是新的,参与外部事务的不算。 (transaction != null)
     * 2. 开启一个空事务,必须是新开的。 (transaction = null)
     *  2.1 不存在外部真实事务
     *  传播行为可能的值: PROPAGATION_NOT_SUPPORTED,PROPAGATION_SUPPORTS,PROPAGATION_NEVER
     *  2.2 存在外部真实事务
     *  传播行为的值: PROPAGATION_NOT_SUPPORTED(因为会将外部事务挂起,以非事务方式运行)
     *  ==========================================================================
     * 判断是否存在一个新的真实事务: newTransaction == true && transaction != null
     * 判断存在一个空事务(非事务执行方式): newTransaction == true && transaction != null
     * 判断此事务是否参与到外部事务: newTransaction == false && transaction != null
     * 判断存在一个事务(新的真实事务或者参与外部事务):transaction != null
     */
    private final boolean newTransaction;

    /**
     * 值为true,事务管理器需要为当前线程绑定当前事务的属性以及TransactionSynchronization回调接口
     * 这个值会受到AbstractPlatformTransactionManager类中定义的transactionSynchronization字段      * 影响。
     * transactionSynchronization可能的值为AbstractPlatformTransactionManager类定义的
     * 三个常量,默认为SYNCHRONIZATION_ALWAYS
     * 1. SYNCHRONIZATION_ALWAYS:总是激活事务同步(无论是空事务还是真实事务)
     * 2. SYNCHRONIZATION_ON_ACTUAL_TRANSACTION: 只有真实事务才激活事务同步
     * 3. SYNCHRONIZATION_NEVER:不激活事务同步
     * 这个字段的作用:
     * 如果为true,那么会将当前的事务属性(传播行为、隔离级别、事务名字、事务只读性、事务是否存活-用以区分      * 是空事务还是真实的事务)以及TransactionSynchronization回调接口
     * ==========================================================================
     * 在DataSourceTransactionManager事务管理器中并且transactionSynchronization为默认值时:
     * newSynchronization=true的情况
     * 1. 外部没有真实事务时
     *   1.1 调用事务接口的getTransaction方法开启一个事务(无论是空事务还是真实事务)
     * 2. 外部存在真实事务
     *   2.1 事务传播行为是PROPAGATION_NOT_SUPPORTED、PROPAGATION_REQUIRES_NEW时。
     *       因为这两个传播行为会挂起外部事务,而开一个新的事务(对应空事务,真实事务)
     */
    private final boolean newSynchronization;

    /**
     * 事务是否只读
     */
    private final boolean readOnly;
    /**
     * 仅仅用来调试,打印日志,避免重复调用logger.isDebug()
     */
    private final boolean debug;

    /**
     * 被挂起的资源,是一个SuspendedResourcesHolder对象
     */
    private final Object suspendedResources;

}

原文地址:https://www.cnblogs.com/wt20/p/10957349.html

时间: 2024-08-03 19:28:22

Spring事务相关接口以及实现类的相关文章

Spring事务管理接口PlatformTransactionManager的实现类DataSourceTransactionManager

package org.springframework.jdbc.datasource; import java.sql.Connection; import java.sql.SQLException; import javax.sql.DataSource; import org.apache.commons.logging.Log; import org.springframework.beans.factory.InitializingBean; import org.springfra

Spring的Resource 接口及其实现类

JDK 所提供的访问资源的类(如java.net.URL.File 等)并不能很好地满足各种底层资源的访问需求,比如缺少从类路径或者Web 容器的上下文中获取资源的操作类.有鉴于此,Spring 设计了一个Resource 接口,它为应用提供了更强的访问底层资源的能力.该接口拥有对应不同资源类型的实现类.先来了解一下Resource 接口的主要方法: boolean exists():资源是否存在: boolean isOpen():资源是否打开: URL getURL() throws IOE

Spring 事务相关点整理

Spring和事务的关系 关系型数据库.某些消息队列等产品或中间件称为事务性资源,因为它们本身支持事务,也能够处理事务. Spring很显然不是事务性资源,但是它可以管理事务性资源,所以Spring和事务之间是管理关系. 就像起码很多领导虽然不会写代码,但是他却管理着一大批会写代码的码农. Spring事务三要素 数据源:表示具体的事务性资源,是事务的真正处理者,如MySQL等. 事务管理器:像一个大管家,从整体上管理事务的处理过程,如打开.提交.回滚等. 事务应用和属性配置:像一个标识符,表明

Spring 事务相关及@Transactional的使用建议

使用步骤: 步骤一.在spring配置文件中引入<tx:>命名空间<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation

Spring 事务相关

事务类型 数据库事务类型有本地事务和分布式事务: 本地事务:就是普通事务,能保证单台数据库上的操作的ACID,被限定在一台数据库上: 分布式事务:涉及两个或多个数据库源的事务,即跨越多台同类或异类数据库的事务(由每台数据库的本地事务组成的),分布式事务旨在保证这些本地事务的所有操作的ACID,使事务可以跨越多台数据库: Java事务类型有JDBC事务和JTA事务: JDBC事务:就是数据库事务类型中的本地事务,通过Connection对象的控制来管理事务: JTA事务:JTA指Java事务API

Spring事务相关记录

一.注解事务的使用: <!-- 数据源 --> <bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close"> <property name="driverClassName" value="${db.driverClassName}" /> <

这可能是最漂亮的Spring事务管理详解

事务概念回顾 什么是事务? 事务是逻辑上的一组操作,要么都执行,要么都不执行. 事物的特性(ACID): 原子性: 事务是最小的执行单位,不允许分割.事务的原子性确保动作要么全部完成,要么完全不起作用: 一致性: 执行事务前后,数据保持一致: 隔离性: 并发访问数据库时,一个用户的事物不被其他事物所干扰,各并发事务之间数据库是独立的: 持久性: 一个事务被提交之后.它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响. Spring事务管理接口介绍 Spring事务管理接口:

一文解析Spring事务管理详解;通俗易懂,轻松掌握!

事务概念回顾 什么是事务? 事务是逻辑上的一组操作,要么都执行,要么都不执行. 事物的特性(ACID): 原子性:?事务是最小的执行单位,不允许分割.事务的原子性确保动作要么全部完成,要么完全不起作用: 一致性:?执行事务前后,数据保持一致: 隔离性:?并发访问数据库时,一个用户的事物不被其他事物所干扰,各并发事务之间数据库是独立的: 持久性:?一个事务被提交之后.它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响. Spring事务管理接口介绍 Spring事务管理接口:

spring事务管理及相关知识

最近在项目中遇到了spring事务的注解及相关知识,突然间感觉自己对于这部分知识只停留在表面的理解层次上,于是乎花些时间上网搜索了一些文章,以及对于源码的解读,整理如下: 一.既然谈到事务,那就先搞清到底什么是事务,或者说,Spring事务管理中的事务到底是指什么? 1.事务(Transaction),通常是指数据库的事务,在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit),例如insert .update.delete等,事务是恢复和并发控制的基本单位. 2.事务