Java Spring 事务处理

一、定义

事务(Transaction)是指作为单个逻辑工作单元执行的一系列操作。操作要么全部成功执行,要么全部失败回滚,以确保数据的一致性和完整性。

二、特性

  1. 原子性(Atomicity):事务被视为不可分割的工作单元,要么全部执行成功,要么全部失败回滚。即使在执行过程中发生了错误,事务也会被回滚到最初的状态,不会留下部分执行的结果。

  2. 一致性(Consistency):事务在执行前后,数据库中的数据应该保持一致性。这意味着事务的执行不会破坏数据库的完整性约束,如唯一性约束、外键约束等。

  3. 隔离性(Isolation):多个事务并发执行时,每个事务的操作应该相互隔离,互不干扰。即使多个事务同时对同一数据进行操作,也不应该相互影响,以避免数据的不一致性。

  4. 持久性(Durability):一旦事务执行成功提交,其结果应该对其他事务可见,并且应该持久保存在系统中,即使系统发生故障或重启,事务的提交结果也不会丢失。

在编程中,特别是在数据库操作中,事务通常用于确保对数据库的一系列操作是原子性的,要么全部成功提交,要么全部回滚。这有助于确保数据的完整性和一致性。

三、事物处理方式

Spring 框架提供了多种方式来处理事务,包括声明式事务管理和编程式事务管理。

  • 声明式事务管理:Spring 声明式事务管理在底层采用了 AOP 技术,其最大的优点在于无须通过编程的方式管理事务,只需要在配置文件中进行相关的规则声明,就可以将事务规则应用到业务逻辑中。
    其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。

  • 编程式事务管理:除了声明式事务管理外,Spring 框架还提供了编程式事务管理的方式。通过使用 TransactionTemplatePlatformTransactionManager 接口,开发人员可以在代码中显式地控制事务的开始、提交和回滚。

四、声明式事务管理注解方式

1. 启用 Spring 的注释驱动事务管理功能

@EnableTransactionManagement 是 Spring 框架提供的一个注解,用于启用注解驱动的事务管理。一旦 @EnableTransactionManagement 注解被添加,Spring 容器将会自动扫描带有 @Transactional 注解的方法,并为其创建代理以支持事务管理。

在 Spring 应用程序中,@EnableTransactionManagement 注解可以被用于配置类(通常是一个带有 @Configuration 注解的类)和启动类(通常是带有 @SpringBootApplication 注解的类)。虽然在这两种情况下都能够启用注解驱动的事务管理,但它们之间存在一些细微的区别。

配置类上使用 @EnableTransactionManagement

  • @EnableTransactionManagement 注解被添加到一个专门的配置类上时,通常用于集中配置和管理事务相关的设置,包括数据源、事务管理器等。

  • 配置类可以包含其他与应用程序配置相关的 bean 定义,例如数据源、JPA 实体管理工厂、持久化单元等。

  • 这种方式使得整个应用程序的事务管理配置更加集中和清晰,同时也使得代码更易于维护和理解。

启动类上使用 @EnableTransactionManagement

  • @EnableTransactionManagement 注解被添加到 Spring Boot 的启动类上时,通常用于启用整个应用程序范围内的注解驱动的事务管理。

  • 启动类是 Spring Boot 应用程序的入口点,通过在启动类上添加 @EnableTransactionManagement 注解,可以方便地启用注解驱动的事务管理,并为整个应用程序启用事务支持。

  • 这种方式使得整个应用程序范围内的事务管理配置更加简单,适用于小型应用程序或需要全局事务支持的情况。

总的来说,无论是在配置类上使用 @EnableTransactionManagement 还是在启动类上使用 @EnableTransactionManagement,都可以有效地启用注解驱动的事务管理。选择使用哪种方式取决于应用程序的规模、结构和需求。如果需要更加灵活的事务管理配置,通常会选择在配置类上使用 @EnableTransactionManagement;而如果只需要简单地启用全局的事务支持,可以选择在启动类上使用 @EnableTransactionManagement。

2. 定义事务管理器

事务交给 spring 管理,那么你肯定要创建一个或者多个事务管理者,有这些管理者来管理具体的事务
在 Spring 应用程序中,要定义事务管理器,通常可以通过创建一个 bean 来配置事务管理器。事务管理器负责协调和管理数据库事务的提交和回滚。在 Spring 中,可以使用 PlatformTransactionManager 接口的实现来定义事务管理器,具体取决于应用程序使用的数据访问技术,比如 JDBC、JPA 或 Hibernate 等。

PlatformTransactionManager 多个实现类,用来应对不同的环境

  • JpaTransactionManager: 如果你用 jpa 来操作 db,那么需要用这个管理器来帮你控制事务。

  • DataSourceTransactionManager: 如果你用是指定数据源的方式,比如操作数据库用的是:JdbcTemplate、mybatis、ibatis,那么需要用这个管理器来帮你控制事务。

  • HibernateTransactionManager: 如果你用 hibernate 来操作 db,那么需要用这个管理器来帮你控制事务。

  • JtaTransactionManager: 如果你用的是 java 中的 jta 来操作 db,这种通常是分布式事务,此时需要用这种管理器来控制事务。

以下是一个简单的示例:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值