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_UNCOMMITTED
、READ_COMMITTED
、REPEATABLE_READ
和SERIALIZABLE
,这些级别控制事务如何被隔离,以避免脏读、不可重复读和幻读。
6. 事务超时
在实际工作中,对于某些性能要求比较高的应用,要求事务执行的时间尽可能的短,可以为事务设置一个超时时间,超过这个时间后,事务将自动回滚。一般事务的超时时间以秒为单位,如果为事务超时时间设置的过长,则与事务相关的数据就会被锁住,影响系统的并发性与整体性能。
由于检测实物超时的任务是在事务开始时启动的,所以,事务的超时对于程序在执行过程中会创建新事物的传播行为才有意义。
7. 事务回滚
Spring允许你配置哪些异常会导致事务回滚。默认情况下,运行时异常(RuntimeException
及其子类)会导致事务回滚,而检查型异常(Exception
及其子类,但不是RuntimeException
的子类)不会。