Spring的Transactional: 处理事务的强大工具

2023年 9月 6日 90.9k 0

引言:Spring的Transactional注解是框架中非常重要的一个特性,它为开发人员提供了方便的事务管理机制。Spring 事务管理分为编码式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染, 因此在实际使用中声明式事务用的比较多。声明式事务有两种方式,一种是在配置文件(xml)中做相关的事务规则声明,另一种是基于@Transactional 注解的方式。

3322.png

一.什么是事务?

  在软件开发中,事务是指由一系列操作组成的逻辑单元,这些操作要么全部成功地执行,要么全部回滚到初始状态,以保证数据的一致性和完整性。事务的使用非常重要,尤其是在处理数据库操作时。

  事务是数据库管理系统中的一条或者多条操作指令的集合,这些操作指令被封装为一个整体,以保证数据库的完整性、一致性和原子性。在事务中,所有操作都成功,事务才能提交,否则回滚,这样可以确保数据的一致性和完整性。

  事务具有以下四个特性:

  原子性(Atomicity):事务是一个原子操作单元,其对数据的修改要么全部执行,要么全不执行。

  一致性(Consistency):事务必须使数据库从一个状态改变为另一个状态。也就是说,事务开始之前和事务结束以后,数据库的完整性没有被破坏。

  隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务。

  持久性(Durability):一旦事务提交,则其结果永久保存在数据库中。即使系统崩溃,重新启动后数据库还能恢复到提交事务后的状态,保证事务的持久性。

  在关系型数据库中,对事务有如下要求:

  - 原子性:事务的原子性是指事务的操作要么全部完成,要么全部不完成。当一个事务中有一部分操作无法完成时,所有操作都需要回滚到操作前的状态。

  - 一致性:一致性是指在一个事务操作前后,数据库的数据应保持一致性状态,即满足数据库的约束、外键约束和参照完整性的要求。

  - 隔离性:隔离性是指在并发环境中,一个事务的执行不应影响其他事务的执行。

  - 持久性:持久性是指一旦一个事务提交,则其结果永久保存在数据库中。即使系统崩溃,重新启动后数据库还能恢复到提交事务后的状态。

二、Spring的Transactional注解

  在Spring框架中,Transactional注解是通过AOP(面向切面编程)来实现的。AOP允许我们在应用程序的关键部分插入代码,而不需要修改现有的业务逻辑。在事务管理中,我们可以使用Transactional注解将事务相关的行为织入到方法中。

  Spring的Transactional注解提供了以下三个关键功能:

   @Transactional:这个注解可以应用于类或方法上,表示该类或方法需要使用事务。当应用于类上时,该类中的所有public方法都将具有事务性。当应用于方法上时,只有该方法具有事务性。

  @Transactional(readOnly = true):这个注解表示该事务只读,不会对数据库进行写操作。这对于只读取数据而不修改数据的情况非常有用。

  @Transactional(rollbackFor = Exception.class):这个注解表示在指定异常的情况下回滚事务。例如,如果一个事务在执行过程中抛出了IOException,并且该事务的@Transactional注解中指定了rollbackFor = IOException.class,那么该事务将回滚并撤销之前的所有操作。

注解的定义

  首先,让我们来看一下Transactional注解的定义。Transactional注解在Spring框架中的实现类是org.springframework.transaction.annotation.Transactional。该注解可以应用在方法级别或类级别,用于标记需要进行事务管理的方法或类。

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {
// 事务的传播行为
Propagation propagation() default Propagation.REQUIRED;

// 事务的隔离级别
Isolation isolation() default Isolation.DEFAULT;

// 事务的超时时间
int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;

// 是否只读事务
boolean readOnly() default false;

// 触发事务回滚的异常
Class

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论