首页 > 其他分享 >Spring事务(Transaction)

Spring事务(Transaction)

时间:2024-08-18 18:52:33浏览次数:12  
标签:事务 Transaction 管理器 隔离 Spring 接口 TransactionStatus

1 Spring事务简洁概况

事务(Transaction)是基于关系型数据库(RDBMS)的企业应用的重要组成部分。在软件开发领域,事务扮演者十分重要的角色,用来确保应用程序数据的完整性和一致性。

事务具有 4 个特性:原子性、一致性、隔离性和持久性,简称为 ACID 特性。

  • 原子性(Atomicity):一个事务是一个不可分割的工作单位,事务中包括的动作要么都做要么都不做。
  • 一致性(Consistency):事务必须保证数据库从一个一致性状态变到另一个一致性状态,一致性和原子性是密切相关的。
  • 隔离性(Isolation):一个事务的执行不能被其它事务干扰,即一个事务内部的操作及使用的数据对并发的其它事务是隔离的,并发执行的各个事务之间不能互相打扰。
  • 持久性(Durability):持久性也称为永久性,指一个事务一旦提交,它对数据库中数据的改变就是永久性的,后面的其它操作和故障都不应该对其有任何影响。

2 事务管理方式

Spring 支持以下 2 种事务管理方式。

选择编程式事务还是声明式事务,很大程度上就是在控制权细粒度和易用性之间进行权衡。

  • 编程式对事物控制的细粒度更高,我们能够精确的控制事务的边界,事务的开始和结束完全取决于我们的需求,但这种方式存在一个致命的缺点,那就是事务规则与业务代码耦合度高,难以维护,因此我们很少使用这种方式对事务进行管理。
  • 声明式事务易用性更高,对业务代码没有侵入性,耦合度低,易于维护,因此这种方式也是我们最常用的事务管理方式。

3 事务管理器

Spring 并不会直接管理事务,而是通过事务管理器对事务进行管理的。

在 Spring 中提供了一个 org.springframework.transaction.PlatformTransactionManager 接口,这个接口被称为 Spring 的事务管理器,其源码如下。

public interface PlatformTransactionManager extends TransactionManager {
    TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throws TransactionException;

    void commit(TransactionStatus status) throws TransactionException;

    void rollback(TransactionStatus status) throws TransactionException;
}

该接口中各方法说明:

Spring 为不同的持久化框架或平台(例如 JDBC、Hibernate、JPA 以及 JTA 等)提供了不同的 PlatformTransactionManager 接口实现,这些实现类被称为事务管理器实现。

事务的隔离级别定义了一个事务可能受其他并发事务影响的程度。

在实际应用中,经常会出现多个事务同时对同一数据执行不同操作,来实现各自的任务的情况。此时就有可能导致脏读、幻读以及不可重复读等问题的出现。

在理想情况下,事务之间是完全隔离的,这自然不会出现上述问题。但完全的事务隔离会导致性能问题,而且并不是所有的应用都需要事务的完全隔离,因此有时应用程序在事务隔离上也有一定的灵活性。

Spring 中提供了以下隔离级别,我们可以根据自身的需求自行选择合适的隔离级别。

Spring 提供了以下 7 种不同的事务传播行为。

4 TransactionDefinition 接口

Spring 将 XML 配置中的事务信息封装到对象 TransactionDefinition 中,然后通过事务管理器的 getTransaction() 方法获得事务的状态(TransactionStatus),并对事务进行下一步的操作。

TransactionDefinition 接口提供了获取事务相关信息的方法,接口定义:

public interface TransactionDefinition {
    int getPropagationBehavior();
    int getIsolationLevel();
    String getName();
    int getTimeout();
    boolean isReadOnly();
}

该接口中方法说明如下。

事务的隔离级别

事务的隔离级别定义了一个事务可能受其他并发事务影响的程度。

在实际应用中,经常会出现多个事务同时对同一数据执行不同操作,来实现各自的任务的情况。此时就有可能导致脏读、幻读以及不可重复读等问题的出现。

在理想情况下,事务之间是完全隔离的,这自然不会出现上述问题。但完全的事务隔离会导致性能问题,而且并不是所有的应用都需要事务的完全隔离,因此有时应用程序在事务隔离上也有一定的灵活性。

Spring 中提供了以下隔离级别,我们可以根据自身的需求自行选择合适的隔离级别。

Spring 提供了以下 7 种不同的事务传播行为。

5 TransactionStatus 接口

TransactionStatus 接口提供了一些简单的方法,来控制事务的执行、查询事务的状态,接口定义如下。

public interface TransactionStatus extends SavepointManager {
    boolean isNewTransaction();
    boolean hasSavepoint();
    void setRollbackOnly();
    boolean isRollbackOnly();
    boolean isCompleted();
}

该接口中各方法说明如下。

6 Spring接口在xml中实现

<!--声明式事务配置-->
<!--1,事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>

</bean>
<!--2,事务通知-->
<tx:advice id="interceptor" transaction-manager="transactionManager">

<tx:attributes>
<!--
tx:method    事务方法
name    方法名可以用*通配符
-->
<tx:method name="transfer"/>
</tx:attributes>
</tx:advice>
<!--3,Aop配置-->
<aop:config>
<aop:pointcut id="cut1" expression="execution(* com.cxd.service.*.*(..))"/>
<aop:advisor advice-ref="interceptor" pointcut-ref="cut1"/>
</aop:config>

标签:事务,Transaction,管理器,隔离,Spring,接口,TransactionStatus
From: https://blog.csdn.net/or77iu_N/article/details/141169329

相关文章

  • 【源码+论文】springboot高校学科竞赛平台
    系统包含:源码+论文所用技术:SpringBoot+Vue+SSM+Mybatis+Mysql获取资料请私聊我目录1系统概述 11.1研究背景 11.2研究目的 11.3系统设计思想 12相关技术 22.1MYSQL数据库 22.2B/S结构 32.3SpringBoot框架简介43系统分析 43.1可行性分析 43.1.1技术......
  • 【源码+论文】springboot基于智能推荐的卫生健康系统
    系统包含:源码+论文所用技术:SpringBoot+Vue+SSM+Mybatis+Mysql获取资料请私聊我目录1系统概述 11.1研究背景 11.2研究目的 11.3系统设计思想 12相关技术 22.1MYSQL数据库 22.2B/S结构 32.3SpringBoot框架简介43系统分析 43.1可行性分析 43.1.1技术......
  • 【源码+论文】springboot知识管理系统
    系统包含:源码+论文所用技术:SpringBoot+Vue+SSM+Mybatis+Mysql获取资料请私聊我目录1系统概述 11.1研究背景 11.2研究目的 11.3系统设计思想 12相关技术 32.1MYSQL数据库 32.2B/S结构 32.3SpringBoot框架简介42.4VUE框架 43系统分析 53.1可行性分......
  • 黑马毕设分享《SpringBoot大学生体质测试管理系统》(源码+lw+部署文档+讲解等)
    文章目录1.前言黑马设计——专注大学生的项目实战开发,免费讲解,毕业答疑辅导黑马设计工作室简介:黑马设计是一家专注大学生的项目实战开发,免费讲解,毕业答疑辅导的工作室✅,创始人是硕士毕业于华南理工大学,工科专业,目前团队成员全职+兼职上百余人,运营线上店铺2家,与B站(IT实战,......
  • 手动实现 Spring 底层机制【初始化 IOC容器+依赖注入+BeanPostProcessor 机制+AOP】【
    手动实现Spring底层机制【初始化IOC容器+依赖注入+BeanPostProcessor机制+AOP】【任务1-6整合版】引言:Spring框架的ioc容器、依赖注入、BeanPostProcessor后置处理器、AOP面向切面编程等特点为我们的开发带来了极大的便利,但是我们不能只学其中的api,更要懂得Spring的底......
  • 基于SpringBoot的农村风貌展示平台的设计与实现(源码+LW+调试文档)
     目录:程序视频演示:程序功能截图:程序部分代码参考:数据库sql:程序技术介绍:后端springboot介绍:mysql介绍:程序论文:​选择我的理由:程序获取:......
  • Spring Boot 中如何解决跨域问题
    SpringBoot中跨域问题是什么   在SpringBoot中,跨域问题是指在浏览器上发送跨源请求时可能会遇到的问题。跨源请求是指通过浏览器发送请求到不同域的服务器。同源策略是浏览器的一种安全机制,限制了跨域请求的行为。如果请求的域与当前页面的域不同,浏览器会阻止请求的发......
  • springboot项目中mybatis的dao接口实现类是如何添加到spring容器中的
    一、@Mapper注解在springboot+mybatis的工程中,如果不做特殊配置,mybatis会查找有@Mapper的接口创建其代理对象添加到spring容器中,接下来就来分析下这个是如何实现的。关键点就在MybatisAutoConfiguration这个自动配置类中publicclassMybatisAutoConfiguration{//这个配......
  • 分布式事务的两阶段提交和三阶段提交分别有什么优缺点?
    分布式事务的两阶段提交(2PC)和三阶段提交(3PC)是分布式系统中常用的事务管理协议,它们各自有优缺点。两阶段提交(2PC)流程:准备阶段(PreparePhase):协调者向所有参与者发送请求,询问是否可以提交事务。每个参与者执行本地事务操作,但不提交(仅预提交),并返回成功或失败的响应给协调者。......
  • 基于SpringBoot3框架-数据库乐观锁、悲观锁、Redis、Zookeeper分布式锁的简单案例实现
    1.分布式锁的定义分布式锁是一种在分布式系统中用来协调多个进程或线程对共享资源进行访问的机制。它确保在分布式环境下,多个节点(如不同的服务器或进程)不会同时访问同一个共享资源,从而避免数据不一致、资源竞争等问题。2.分布式锁的工作原理分布式锁的工作原理与单机锁......