当前位置: 首页 > article >正文

Spring学习笔记_28——事务

Spring 事务

1. 介绍

在Spring框架中,事务管理是其核心功能之一,它提供了声明式事务管理和编程式事务管理两种方式。通过这些方式,开发者可以更加方便地控制数据库操作的事务性,确保数据的一致性和完整性。

2. 分类

通过Spring管理的事务总体上可以分为逻辑事务和物理事务

  • 物理事务:通常指的是针对特定数据库的事务
  • 逻辑事务:通常指的是通过Spring框架管理的事务,这种事务是建立在物理事务之上的,比物理事务更抽象

Spring支持两种事务声明方式:

  • 声明式事务管理
  • 声明式事务管理(Declarative Transaction Management)允许开发者通过配置来定义事务的边界,而无需编写额外的代码来管理事务的开始、提交或回滚。这种方式基于AOP(面向切面编程)实现,使得事务处理与业务逻辑分离,提高了代码的可读性和可维护性。
  • 使用注解:在Spring中,最常用的声明式事务管理方法是使用@Transactional注解。可以在类级别或者方法级别上添加此注解,以指定哪些方法应该在一个事务中执行。
  • 配置文件:除了使用注解外,也可以通过XML配置文件来定义事务管理器和事务属性。
  • 编程式事务管理
  • 编程式事务管理(Programmatic Transaction Management)则需要在代码中显式地调用事务的开始、提交和回滚等操作。这种方式提供了更细粒度的控制,但会增加代码的复杂度,通常在特定场景下使用,如复杂的事务逻辑无法通过声明式方式实现时。
  • TransactionTemplate:Spring提供了一个TransactionTemplate工具类,可以简化编程式事务管理的代码。
  • PlatformTransactionManager:这是Spring提供的一个接口,用于管理事务。通过其实现类(例如DataSourceTransactionManager),可以直接进行事务的管理。

3. 属性

无论是声明式还是编程式事务管理,都可以设置事务的各种属性,包括但不限于:

  • 传播行为:定义了多个事务方法之间调用时,事务如何传播。例如,REQUIRED表示如果当前没有事务,则创建一个新的事务;如果已经存在一个事务,则加入该事务。
  • 隔离级别:指定了事务之间的隔离程度,避免并发事务之间的干扰。
  • 超时:指定了事务必须完成的时间限制,超过这个时间限制,事务将自动回滚。
  • 只读:如果事务只涉及查询操作,可以将其标记为只读,这有助于提高性能。

4. 传播行为

Spring定义了多种事务的传播行为,例如:

  • REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,就新建一个事务。
  • REQUIRES_NEW:新建事务,如果当前存在事务,就把当前事务挂起。
  • SUPPORTS:如果当前存在事务,就加入该事务;如果当前没有事务,就以非事务方式执行。
  • NOT_SUPPORTED:以非事务方式执行,如果当前存在事务,就把当前事务挂起。
  • MANDATORY:如果当前存在事务,就加入该事务;如果当前没有事务,就抛出异常。
  • NEVER:以非事务方式执行,如果当前存在事务,就抛出异常。
  • NESTED:如果当前存在事务,就在嵌套事务内执行。如果当前没有事务,就新建一个事务。

5. 隔离级别

隔离级别:Spring支持多种事务隔离级别,如READ_UNCOMMITTEDREAD_COMMITTEDREPEATABLE_READSERIALIZABLE,这些级别控制事务如何被隔离,以避免脏读、不可重复读和幻读。

6. 事务超时

在实际工作中,对于某些性能要求比较高的应用,要求事务执行的时间尽可能的短,可以为事务设置一个超时时间,超过这个时间后,事务将自动回滚。一般事务的超时时间以秒为单位,如果为事务超时时间设置的过长,则与事务相关的数据就会被锁住,影响系统的并发性与整体性能。

由于检测实物超时的任务是在事务开始时启动的,所以,事务的超时对于程序在执行过程中会创建新事物的传播行为才有意义。

7. 事务回滚

Spring允许你配置哪些异常会导致事务回滚。默认情况下,运行时异常(RuntimeException及其子类)会导致事务回滚,而检查型异常(Exception及其子类,但不是RuntimeException的子类)不会。


http://www.kler.cn/a/385723.html

相关文章:

  • GRE做题笔记(零散的个人经验)
  • python-文件内容操作
  • LeetCode题解:17.电话号码的数字组合【Python题解超详细,回溯法、多叉树】,知识拓展:深度优先搜索与广度优先搜索
  • 在Ubuntu22.04上源码构建ROS noetic环境
  • 物理hack
  • 实验8.1 无失真信源编码的实现
  • 【Qt】Macbook M1下载安装
  • 数据分析-43-时间序列预测之深度学习方法GRU
  • 【TS】九天学会TS语法——6.TypeScript泛型图文详解
  • 【Django】创建应用
  • Quartus Prime的应用
  • CentOS操作系统安装过程简介
  • Flutter 中 Provider 的使用指南
  • Python爬虫与Web渗透测试入门指南——初学者防踩雷
  • 现代Web开发:React Router 深度解析
  • MRCTF2020:千层套路
  • docker拉取和打包多个镜像
  • ros入门:参数服务器通信
  • pytorch torch.tile用法
  • 读取excel并且显示进度条
  • 367.有效地完全平方数
  • 出海企业如何借助云计算平台实现多区域部署?
  • linux---vi和vim快捷键
  • 「QT」几何数据类 之 QMatrix4x4 4x4矩阵类
  • window 利用Putty免密登录远程服务器
  • 【目标检测】目标检测中全连接层(Fully Connected Layer)