Spring事务管理详解:原理、配置与性能优化

news/2025/3/24 18:18:06/文章来源:https://www.cnblogs.com/java-note/p/18787658

Spring事务管理

1. 事务管理概述

在软件开发中,事务管理是确保数据一致性和完整性的重要机制。事务是一系列操作的集合,这些操作要么全部成功,要么全部失败。如果在事务执行过程中发生任何错误,事务将被回滚,以确保数据状态的一致性。

Spring事务管理是Spring框架的核心功能之一,它通过声明式事务管理和编程式事务管理两种方式,为开发者提供了灵活且强大的事务控制能力。Spring事务管理的核心目标是简化事务的使用,同时提供高度的灵活性和可扩展性。

2. Spring事务管理的两种方式

2.1 声明式事务管理

声明式事务管理是Spring事务管理中最常用的方式。它通过注解或XML配置的方式,将事务管理的逻辑与业务逻辑分离,从而使得开发者可以专注于业务逻辑的实现。

2.1.1 基于注解的声明式事务

在Spring中,@Transactional注解是最常用的声明式事务管理方式。通过在方法或类上添加@Transactional注解,可以声明该方法或类中的所有方法都需要事务支持。

  • 作用范围@Transactional注解可以作用于方法、类或接口。通常推荐将其作用于方法上,因为这样可以更细粒度地控制事务。
  • 常用配置参数
    • propagation:事务的传播行为,默认值为Propagation.REQUIRED
    • isolation:事务的隔离级别,默认值为Isolation.DEFAULT
    • timeout:事务的超时时间,默认值为-1(不会超时)。
    • readOnly:指定事务是否为只读事务,默认值为false
    • rollbackFor:用于指定能够触发事务回滚的异常类型。

示例代码:

@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
public void addLeader(Leader teacher) {leaderDao.insert(teacher);int num = 1 / 0; // 故意制造异常以触发回滚
}
2.1.2 基于XML的声明式事务

除了注解方式,Spring还支持通过XML配置文件来声明事务。这种方式需要在Spring的配置文件中定义事务管理器,并通过<tx:advice><aop:config>来指定事务的切面。

示例配置:

<tx:advice id="transactionInterceptor" transaction-manager="dataSourceTransactionManager"><tx:attributes><tx:method name="addTeacher" isolation="DEFAULT" propagation="REQUIRED"/><tx:method name="update*" isolation="DEFAULT" propagation="REQUIRED"/></tx:attributes>
</tx:advice><aop:config><aop:pointcut id="pc" expression="execution(* world.xuewei.transaction.xml.TeacherService.*(..))"/><aop:advisor advice-ref="transactionInterceptor" pointcut-ref="pc"/>
</aop:config>
2.2 编程式事务管理

编程式事务管理是通过代码直接控制事务的开始、提交和回滚。这种方式相比声明式事务管理更加灵活,但代码的可读性和可维护性较差。

在Spring中,可以通过TransactionTemplatePlatformTransactionManager来实现编程式事务管理。

示例代码:

@Autowired
private PlatformTransactionManager transactionManager;public void addLeader(Leader teacher) {TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());try {leaderDao.insert(teacher);int num = 1 / 0; // 故意制造异常以触发回滚transactionManager.commit(status);} catch (Exception e) {transactionManager.rollback(status);}
}

3. Spring事务的核心接口

3.1 PlatformTransactionManager

PlatformTransactionManager是Spring事务管理的核心接口,它定义了事务管理的基本操作,包括获取事务、提交事务和回滚事务。

public interface PlatformTransactionManager {TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;void commit(TransactionStatus status) throws TransactionException;void rollback(TransactionStatus status) throws TransactionException;
}
3.2 TransactionDefinition

TransactionDefinition接口定义了事务的基本属性,包括事务的传播行为、隔离级别、超时时间、是否只读等。

public interface TransactionDefinition {int getPropagationBehavior();int getIsolationLevel();int getTimeout();boolean isReadOnly();
}
3.3 TransactionStatus

TransactionStatus接口用来记录事务的状态,包括是否是新事务、是否有恢复点、是否只回滚等。

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

4. 事务的传播行为

事务的传播行为定义了多个事务方法之间如何相互协作。Spring支持以下几种传播行为:

  • Propagation.REQUIRED:如果当前已经存在一个事务,则加入该事务;如果当前没有事务,则新建一个事务。这是默认值。
  • Propagation.SUPPORTS:如果当前已经存在一个事务,则加入该事务;如果当前没有事务,则以非事务方式执行。
  • Propagation.MANDATORY:如果当前已经存在一个事务,则加入该事务;如果当前没有事务,则抛出异常。
  • Propagation.REQUIRES_NEW:每次都会新建一个事务,如果当前已经存在一个事务,则将当前事务挂起。
  • Propagation.NOT_SUPPORTED:以非事务方式执行操作,如果当前存在一个事务,则将当前事务挂起。
  • Propagation.NEVER:以非事务方式执行操作,如果当前存在一个事务,则抛出异常。
  • Propagation.NESTED:如果当前已经存在一个事务,则在该事务内嵌套一个子事务;如果当前没有事务,则新建一个事务。

5. 事务的隔离级别

事务的隔离级别定义了多个事务并发执行时的隔离程度。Spring支持以下几种隔离级别:

  • Isolation.DEFAULT:使用数据库默认的隔离级别。
  • Isolation.READ_UNCOMMITTED:允许读取未提交的数据。
  • Isolation.READ_COMMITTED:允许读取已提交的数据。
  • Isolation.REPEATABLE_READ:保证在同一个事务中,多次读取同一数据的结果是一致的。
  • Isolation.SERIALIZABLE:最高的隔离级别,事务串行执行。

6. 事务的回滚规则

事务的回滚规则定义了哪些异常会导致事务回滚。在Spring中,可以通过@Transactional注解的rollbackFornoRollbackFor属性来指定。

  • rollbackFor:指定哪些异常类型会导致事务回滚。
  • noRollbackFor:指定哪些异常类型不会导致事务回滚。

7. 事务的只读属性

事务的只读属性用于优化数据库操作。如果一个事务被标记为只读事务,数据库可以利用这一信息进行优化。

@Transactional注解中,可以通过readOnly属性来指定事务是否为只读事务。

8. 事务的超时时间

事务的超时时间定义了事务的最大执行时间。如果事务在超时时间内没有完成,则会自动回滚。

@Transactional注解中,可以通过timeout属性来指定事务的超时时间。

9. Spring事务管理的最佳实践

  • 合理使用事务传播行为:根据业务需求选择合适的事务传播行为。
  • 避免过度使用事务:事务会增加系统的复杂性和性能开销,应避免在不需要事务的地方使用事务。
  • 合理设置事务隔离级别:根据业务需求选择合适的隔离级别,避免过度隔离导致性能问题。
  • 明确事务回滚规则:明确哪些异常会导致事务回滚,哪些异常不会导致事务回滚。
  • 使用声明式事务管理:声明式事务管理代码更加简洁,可读性和可维护性更好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/904142.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web-CodeInject

<?php#Author: h1xaerror_reporting(0); show_source(__FILE__);eval("var_dump((Object)$_POST[1]);");eval("var_dump((Object)$_POST[1]);");:这行代码使用了eval()函数,这是一个非常危险的函数,因为它会执行传递给它的字符串作为PHP代码。这意味…

kettle插件-dm达梦数人大金仓Vastbase数据库插件

在国家大力倡导原创技术、推动信息技术应用创新(信创)的政策背景下,摆脱对国外技术的依赖、构建自主可控的信息技术体系成为重要发展方向。大数据作为信息技术的重要组成部分,国产大数据技术和产品迎来了前所未有的发展机遇。 信创旨在实现核心技术自主可控,保障国家信息安…

广义优势估计(GAE):端策略优化PPO中偏差与方差平衡的关键技术

广义优势估计(Generalized Advantage Estimation, GAE)由Schulman等人在2016年的论文中提出,是近端策略优化(PPO)算法的重要基础理论,也是促使PPO成为高效强化学习算法的核心因素之一。 GAE的理论基础建立在资格迹(eligibility traces)和时序差分λ(TD-λ)之上,为深入理解GA…

集合体系介绍、collection的使用--java进阶day09

1.集合体系结构 我们要学习的集合大体分为两种,一种是单列集合,一种是双列集合2.单列集合 单列集合又分为两个派系,分别为list接口和set接口,这两个接口皆是collection接口的子接口3.Collection接口既然要使用,那就必然要创建对象,但我们知道Collection是接口,不能实例化…

mybatis组件SqlSource的种类

SqlSource是mybatis重要的组件,是对你写的sql语句的简单封装。public interface SqlSource {BoundSql getBoundSql(Object parameterObject);}这个接口有很多种实现:VelocitySqlSource这个实现类是一个测试。实际上mybatis根本就不会使用这个实现类。 那么在mybatis内部是在哪…

静雅斋目录2

托管于国内企业顶想云的使用目录前情概要 本来已经有一个使用目录了,但是实在是受不了 GitHub 时不时卡壳的表现,就重新启用这个国内的搜索目录,外观要稍微差一点,但使用体验要好得多。 托管地址 托管于 顶想云 平台的目录样式 .编辑地址:顶想云.iframe-container { /* 容…

ARP高级欺骗-配置路由转发

引出问题: 当我们发起一次ARP欺骗之后,目标主机会出现断网情况。这种很容易就会被目标主机A发现。那我们怎么让目标主机发现不了自己被ARP欺骗了呢?问题描述: 1.受害主机A断网: 当目标主机A上网时,会进行TCP的连接,但是因为ARP欺骗之后,主机A的路由转发到的是主机B而不…

使用XIAO ESP32C6, XIAO扩展板和SHT31温湿度传感器构建温湿度计

我很高兴与您分享我的最新项目:我使用XIAO ESP32C6, XIAO扩展板和SHT31温湿度传感器构建的DIY温湿度计。我的目标是创造一种设备,可以帮助我监测家里的湿度水平,特别是因为我住在沿海热带地区,那里的湿度波动很大。这个想法来自于我需要保持一个舒适的室内环境。有时空气会…

可视化图解算法:判断一个链表是否为回文结构(回文链表)

对于链表的相关操作,我们总结了一套【可视化+图解】方法,依据此方法来解决链表相关问题,链表操作变得易于理解,写出来的代码可读性高也不容易出错。1. 题目 描述 给定一个链表,请判断该链表是否为回文结构。 回文是指该字符串正序逆序完全一致。 数据范围: 链表节点数 0≤…

使用ESP32和Gemini REST API语音输入调用带有自定义参数的函数

我们在建造什么? 在之前的教程中,我介绍了如何通过REST将ESP32连接到谷歌Gemini API以发送音频文件并对其进行转录。在本教程中,我将扩展到实际使用录制的音频而不是转录它-在这种情况下,打开和关闭LED环,加上根据语音命令改变LED的颜色。虽然我只是在操纵一个LED环,但你…

20244211 实验一《Python程序设计》实验报告

20244211 2024-2025-2 《Python程序设计》实验一报告 课程:《Python程序设计》 班级: 2442 姓名: 朱睿颖 学号:20244211 实验教师:王志强老师 实验日期:2025年3月18日 必修/选修: 专业选修课 1.实验内容熟悉Python开发环境; 练习Python运行、调试技能; 编写程序,练习…