一文玩转@Transactional SpringAOP声明式事务

2024-05-12 05:28

本文主要是介绍一文玩转@Transactional SpringAOP声明式事务,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.使用详解

`@Transactional` 注解是Spring框架中用于声明式事务管理的核心注解之一。通过在方法或类上添加 `@Transactional` 注解,你可以告诉Spring在调用该方法时启用事务管理。以下是 `@Transactional` 注解的使用方法及参数详解:

1. 在方法上使用:

@Transactionalpublic void someTransactionalMethod() {// 这个方法的执行将在一个事务中// 任何数据库操作都会在这个方法执行的同一个事务中}

2. 在类上使用:

@Service@Transactionalpublic class SomeTransactionalService {// 在这个类中所有的方法调用都将在事务中执行}

3. 参数:

   - readOnly:指定事务是否为只读。如果设置为 `true`,表示该事务只读取数据,不会对数据进行修改。默认值为 `false`。

@Transactional(readOnly = true)public void readOnlyMethod() {// 仅读取数据的操作}

   - timeout:指定事务的超时时间,单位为秒。如果在指定时间内事务没有完成,将会被回滚。默认值为 `TransactionDefinition.TIMEOUT_DEFAULT`,表示使用默认的超时时间。

@Transactional(timeout = 60) // 60秒超时public void methodWithTimeout() {// 可能会耗时很长的操作}

   - rollbackFor和 noRollbackFor:指定在哪些异常发生时事务应该回滚或不回滚。

@Transactional(rollbackFor = {SQLException.class, IOException.class})public void methodThatMayThrowExceptions() throws SQLException, IOException {// 可能会抛出SQLException或IOException的操作}

   - propagation:指定事务的传播行为。例如,是否要在当前事务内加入已存在的事务,或者要开启一个新的事务。

@Transactional(propagation = Propagation.REQUIRED)public void methodWithPropagation() {// 这个方法将会在一个事务中执行,如果当前没有事务,则会开启一个新的事务}

   这些是最常用的 `@Transactional` 注解的参数。通过合理配置这些参数,你可以灵活地管理你的事务行为。

2.修改事务的隔离级别

在Spring中,默认的事务隔离级别是数据库的默认级别。通常情况下,大多数数据库的默认事务隔离级别是**读已提交(Read Committed)**。

事务隔离级别决定了一个事务对于其他事务的可见性以及对其他事务的影响。不同的隔离级别会对并发访问数据库时出现的问题产生不同的影响。

在Spring中,你可以通过设置 `@Transactional` 注解的 `isolation` 属性来指定事务的隔离级别,例如:


@Transactional(isolation = Isolation.READ_UNCOMMITTED)
public void someTransactionalMethod() {// 这个方法的事务隔离级别为读未提交
}

`Isolation` 是一个枚举类型,包含了不同的隔离级别选项,例如 `READ_UNCOMMITTED`、`READ_COMMITTED`、`REPEATABLE_READ` 和 `SERIALIZABLE` 等。通过显式地设置 `isolation` 属性,你可以覆盖默认的隔离级别。

但需要注意的是,如果你没有显式地指定事务的隔离级别,Spring 将使用底层数据库的默认隔离级别作为默认值。

3.底层实现

`@Transactional` 注解是Spring框架中用于声明式事务管理的核心注解之一。它的实现主要依赖于Spring的事务管理器和AOP(面向切面编程)机制。

以下是对 `@Transactional` 注解在Java源码中的简要解析:

1. 源码位置:

   `@Transactional` 注解的源码位于 Spring Framework 项目中的 `org.springframework.transaction.annotation` 包下。

2. 注解定义:

   `@Transactional` 注解是一个元注解,它的定义如下:

@Target({ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Transactional {// 属性定义,例如 isolation、propagation、timeout、readOnly 等}

3. 属性:

   `@Transactional` 注解支持多个属性,用于配置事务的行为。一些常用的属性包括:

   - `isolation`:指定事务的隔离级别。
   - `propagation`:指定事务的传播行为。
   - `timeout`:指定事务的超时时间。
   - `readOnly`:指定事务是否为只读事务。
   - `rollbackFor` 和 `noRollbackFor`:指定在哪些异常发生时事务应该回滚或不回滚。

4. AOP代理:

   Spring使用AOP机制来实现 `@Transactional` 注解。在运行时,Spring会在方法执行前后织入事务管理相关的代码,以确保方法在事务的上下文中执行。

   这意味着 `@Transactional` 注解可以将事务管理从业务逻辑代码中分离出来,使得代码更加清晰和模块化。

5. 事务管理器:

   `@Transactional` 注解的实现依赖于Spring的事务管理器。在使用 `@Transactional` 注解时,你需要在Spring的配置文件中配置事务管理器,以便让Spring知道如何管理事务。

   Spring支持多种事务管理器,包括基于JDBC的事务管理器、基于JTA的事务管理器、以及基于Hibernate等ORM框架的事务管理器。

6. 源码实现:

   `@Transactional` 注解的具体实现比较复杂,涉及到Spring的AOP、事务拦截器、事务管理器等多个模块。它主要通过AOP机制来拦截带有 `@Transactional` 注解的方法调用,并在方法执行前后启动和提交事务。

总的来说,`@Transactional` 注解是Spring框架中用于声明式事务管理的重要工具,它使得在Spring应用中使用事务变得简单和便捷。

这篇关于一文玩转@Transactional SpringAOP声明式事务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/981724

相关文章

一文详解如何在Vue3中封装API请求

《一文详解如何在Vue3中封装API请求》在现代前端开发中,API请求是不可避免的一部分,尤其是与后端交互时,下面我们来看看如何在Vue3项目中封装API请求,让你在实现功能时更加高效吧... 目录为什么要封装API请求1. vue 3项目结构2. 安装axIOS3. 创建API封装模块4. 封装API请求

一文带你搞懂Redis Stream的6种消息处理模式

《一文带你搞懂RedisStream的6种消息处理模式》Redis5.0版本引入的Stream数据类型,为Redis生态带来了强大而灵活的消息队列功能,本文将为大家详细介绍RedisStream的6... 目录1. 简单消费模式(Simple Consumption)基本概念核心命令实现示例使用场景优缺点2

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

一文带你搞懂Python中__init__.py到底是什么

《一文带你搞懂Python中__init__.py到底是什么》朋友们,今天我们来聊聊Python里一个低调却至关重要的文件——__init__.py,有些人可能听说过它是“包的标志”,也有人觉得它“没... 目录先搞懂 python 模块(module)Python 包(package)是啥?那么 __in

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字

电脑死机无反应怎么强制重启? 一文读懂方法及注意事项

《电脑死机无反应怎么强制重启?一文读懂方法及注意事项》在日常使用电脑的过程中,我们难免会遇到电脑无法正常启动的情况,本文将详细介绍几种常见的电脑强制开机方法,并探讨在强制开机后应注意的事项,以及如何... 在日常生活和工作中,我们经常会遇到电脑突然无反应的情况,这时候强制重启就成了解决问题的“救命稻草”。那

通过Spring层面进行事务回滚的实现

《通过Spring层面进行事务回滚的实现》本文主要介绍了通过Spring层面进行事务回滚的实现,包括声明式事务和编程式事务,具有一定的参考价值,感兴趣的可以了解一下... 目录声明式事务回滚:1. 基础注解配置2. 指定回滚异常类型3. ​不回滚特殊场景编程式事务回滚:1. ​使用 TransactionT

一文详解JavaScript中的fetch方法

《一文详解JavaScript中的fetch方法》fetch函数是一个用于在JavaScript中执行HTTP请求的现代API,它提供了一种更简洁、更强大的方式来处理网络请求,:本文主要介绍Jav... 目录前言什么是 fetch 方法基本语法简单的 GET 请求示例代码解释发送 POST 请求示例代码解释

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML