一文玩转@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

相关文章

MySql 事务练习

事务(transaction) -- 事务 transaction-- 事务是一组操作的集合,是一个不可分割的工作单位,事务会将所有的操作作为一个整体一起向系统提交或撤销请求-- 事务的操作要么同时成功,要么同时失败-- MySql的事务默认是自动提交的,当执行一个DML语句,MySql会立即自动隐式提交事务-- 常见案例:银行转账-- 逻辑:A给B转账1000:1.查询

Lua 脚本在 Redis 中执行时的原子性以及与redis的事务的区别

在 Redis 中,Lua 脚本具有原子性是因为 Redis 保证在执行脚本时,脚本中的所有操作都会被当作一个不可分割的整体。具体来说,Redis 使用单线程的执行模型来处理命令,因此当 Lua 脚本在 Redis 中执行时,不会有其他命令打断脚本的执行过程。脚本中的所有操作都将连续执行,直到脚本执行完成后,Redis 才会继续处理其他客户端的请求。 Lua 脚本在 Redis 中原子性的原因

秒变高手:玩转CentOS 7软件更换的方法大全

在 CentOS 7 中更换软件源可以通过以下步骤完成。更换源可以加快软件包的下载速度,特别是当默认源速度较慢时。以下是详细步骤: 前言 为了帮助您解决在使用CentOS 7安装不了软件速度慢的问题,我们推出了这份由浪浪云赞助的教程——“CentOS7如何更换软件源加快下载速度”。 浪浪云,以他们卓越的弹性计算、云存储和网络服务受到广泛好评,他们的支持和帮助使得我们可以将最前沿的技术知识分

spring事务属性的xml格式配置

实际是使用代理做的事务优化 <!--配置事务的属性--><tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!--匹配所有以add开头的方法--><tx:method name="add*" propagation="REQUIRED" /> <tx:metho

Spring Cloud整合Seata实现分布式事务

文章目录 1.Seata1.1 官网1.2 下载1.3 通过安装包运行seata1.3.1 解压seata-server-1.3.0.zip1.3.2 修改 conf/file.conf 配置文件1.3.3 修改conf/registry.conf配置文件1.3.4 添加seata配置信息到nacos1.3.5 配置seata服务端数据库表结构1.3.6 启动seata 2.Spring

springAOP 和 aspectJ 有什么区别

介绍 如今有多个可用的AOP库,这些组件需要回答一系列的问题: 是否与我现有的应用兼容?我在哪实现AOP?集成到我的应用是否很快?性能开销是多少? 本文中,我们将会着重回答这些问题,并介绍两款Java最流行的AOP框架:Spring AOP 和 AspectJ。 AOP概念 在我们开始之前,让我们对术语和核心概念做一个快速,高水平的回顾: Aspect切面:一个分布在应用程序中多个位置

分布式 事务的几种实现方案

背景 四月初,去面试了本市的一家之前在做办公室无人货架的公司,虽然他们现在在面临着转型,但是对于我这种想从传统企业往互联网行业走的孩子来说,还是比较有吸引力的。 在面试过程中就提到了分布式事务问题。我又一次在没有好好整理的问题上吃了亏,记录一下,还是长记性 !!! 先看面试过程 面试官先是在纸上先画了这样一张图: 让我看这张图按照上面的流程走,有没有什么问题?面试官并没有直接说出来这里面

分布式事务 全面解析

1 面试题 分布式事务了解吗?你们如何解决分布式事务问题的? 2 考点分析 只要聊到做了分布式系统,必问分布式事务,若你对分布式事务一无所知的话,确实很坑,起码得知道有哪些方案,一般怎么来做,每个方案的优缺点是什么。 现在面试,分布式系统成了标配,而分布式系统带来的分布式事务也成了标配. 你做系统肯定要用事务,那你用事务的话,分布式系统之后肯定要用分布式事务. 先不说你搞过没有,起码你

Post-Training有多重要?一文带你了解全部细节

1. 简介 随着LLM学界和工业界日新月异的发展,不仅预训练所用的算力和数据正在疯狂内卷,后训练(post-training)的对齐和微调方法也在不断更新。InstructGPT、WebGPT等较早发布的模型使用标准RLHF方法,其中的数据管理风格和规模似乎已经过时。近来,Meta、谷歌和英伟达等AI巨头纷纷发布开源模型,附带发布详尽的论文或报告,包括Llama 3.1、Nemotron 340

全能AI神器!工作效率提升80倍!Zmo.ai带你玩转AI做图!

今天,我要给大家介绍一款神器:Zmo.ai。 这个平台简直是做图神器,集多种功能于一身,让你像专业人士一样轻松创建和编辑图像,不需要任何美术与设计基础,真的非常适合我们这些“手残党”! 我们只需单击按钮即可从文本或图像生成令人惊叹的 AI 艺术、图像、动漫和逼真的照片,最关键的是它的功能真的很全啊! Zmo.ai旗下产品分类: AI照片生成器 AI动漫生成器 AI照片编辑器 A