Spring中事务是如何实现的?

在Spring中,事务管理是通过AOP(面向切面编程)和代理模式实现的。Spring提供了声明式事务管理,允许开发者通过简单的配置来管理事务,而不需要手动编写事务管理的代码。

概述:

1.Spring事务底层是基于数据库事务和AOP机制的

2.首先对于使用了@Transactional注解的Bean,Spring会创建一个代理对象作为Bean

3.当调用代理对象的方法时,会先判断该方法上是否加了@Transactioral注解

4.如果加了,那么则利用事务管理器创建一个数据库连接

5.并且修改数据库连接的autocommit属性为false,禁止此连接的自动提交,这是实现Spring事务非常重要的一步

6.然后执行当前方法,方法中会执行sql

7.执行完当前方法后,如果没有出现异常就直接提交事务

8.如果出现了异常,并且这个异常是需要回滚的就会回滚事务,否则仍然提交事务

9.Spring事务的隔离级别对应的就是数据库的隔离级别

10.Spring事务的传播机制是Spring事务自己实现的,也是Spring事务中最复杂的

11.Spring事务的传播机制是基于数据库连接来做的,一个数据库连接一个事务,如果传播机制配置为需要新开一个事务,那么实际上就是先建立一个数据库连接,在此新数据库连接上执行sql

详细介绍:

1. **事务管理器(Transaction Manager)**:
   - Spring事务管理的核心是事务管理器,它是一个接口,有多个实现类,如`DataSourceTransactionManager`、`JtaTransactionManager`、`HibernateTransactionManager`等。事务管理器负责事务的开始、提交和回滚。

2. **事务定义(Transaction Definition)**:
   - 事务定义包括事务的传播行为、隔离级别、超时时间、是否只读等属性。这些属性可以通过`@Transactional`注解或XML配置来指定。

3. **事务状态(Transaction Status)**:
   - 事务状态表示当前事务的状态,如是否是新事务、是否有保存点、是否已完成等。事务管理器使用事务状态来控制事务的执行。

4. **AOP代理(AOP Proxy)**:
   - Spring使用AOP代理来实现事务管理。当一个方法被标注了`@Transactional`注解时,Spring会为该方法生成一个代理对象。在调用该方法时,实际调用的是代理对象的方法。

5. **事务拦截器(TransactionInterceptor)**:
   - 事务拦截器是AOP中的一个通知(Advice),它负责在方法调用前后进行事务管理。在方法调用前,事务拦截器会开始一个新事务或加入一个现有事务;在方法调用后,事务拦截器会根据方法的执行结果提交或回滚事务。

6. **事务传播行为(Transaction Propagation Behavior)**:
   - 事务传播行为定义了事务方法调用时的事务边界。Spring提供了多种传播行为,如`REQUIRED`、`REQUIRES_NEW`、`NESTED`、`SUPPORTS`、`NOT_SUPPORTED`、`NEVER`等。

7. **事务回滚规则(Transaction Rollback Rules)**:
   - 默认情况下,Spring事务在遇到unchecked异常(如`RuntimeException`及其子类)时会回滚。可以通过`rollbackFor`和`noRollbackFor`属性来指定需要回滚或不回滚的异常类型。

以下是一个简单的示例,展示了如何在Spring中使用`@Transactional`注解进行事务管理:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;@Service
public class MyService {@Autowiredprivate MyRepository myRepository;@Transactionalpublic void performTransaction() {// 业务逻辑myRepository.saveData();// 如果发生异常,事务会回滚throw new RuntimeException("Simulated exception");}
}

在这个示例中,`performTransaction`方法被标注了`@Transactional`注解,这意味着该方法将在事务上下文中执行。如果方法中抛出`RuntimeException`,事务将回滚。

总结来说,Spring事务管理通过AOP代理和事务拦截器实现了声明式事务管理,使得开发者可以简单地通过注解或配置来管理事务,而不需要手动编写复杂的事务管理代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/47528.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微软GraphRAG +本地模型+Gradio 简单测试笔记

安装 pip install graphragmkdir -p ./ragtest/input#将文档拷贝至 ./ragtest/input/ 下python -m graphrag.index --init --root ./ragtest修改settings.yaml encoding_model: cl100k_base skip_workflows: [] llm:api_key: ${GRAPHRAG_API_KEY}type: openai_chat # or azu…

uniapp踩坑之项目:uni-table垂直居中和水平居中

uni-table 中的水平居中uni-td align"center"&#xff0c;css里的属性vertical-align: middle //html 水平居中<uni-table ref"table" :loading"loading" border stripe emptyText"暂无更多数据"><uni-tr><uni-th :wid…

[HDCTF2019]MFC

[HDCTF2019]MFC-CSDN博客 不会写 完全画瓢 我还以为win32什么系统逆向 原来是小瘪三! VM保护 下载xspy(看雪上有) 打开32位的 再打开 这个窗口 把这个放大镜托到这个大窗口(里面有个小窗口,不要托错了) 下面这个 onmeg 就她不正常,是什么0464 #include <stdio.h&g…

mac环境下安装python3的图文教程

Python 是一种功能多样且强大的编程语言&#xff0c;在各个领域得到广泛应用。许多 Mac 用户都在其设备上安装和运行 Python&#xff0c;以运行特定的应用程序或创建、运行自己的 Python 脚本。 文章源自设计学徒自学网-http://www.sx1c.com/49441.html 虽然某些版本的 macOS…

GO——GMP 好文整理

GMP相关好文推荐&#xff1a; Golang 调度器设计思想、GMP 协程调度模型详解 Golang的协程调度器原理及GMP设计思想 Golang调度器GMP原理与调度全分析

lua 游戏架构 之 资源加载 LoaderManager (一)

定义一个 LoaderManager class&#xff0c;用于管理各种资源加载器。它使用了对象池&#xff08;Object Pool&#xff09;来优化资源加载器的创建和销毁&#xff0c;从而提高性能 举例定义一个 PrefabLoader --[[Desc: 封装AAS的接口&#xff0c;加载Prefab --]]---alias Pre…

STM32判断休眠

STM32是否进入休眠模式(或称为睡眠模式)的判断主要基于其功耗状态、内部时钟的关闭情况以及唤醒后的行为。以下是根据参考文章提供的信息,判断STM32是否进入休眠模式的方法: 功耗状态: STM32在休眠模式下,功耗会显著降低。这是因为休眠模式仅关闭了内核时钟,但外设仍然保…

MySQL 实现模糊匹配

摘要&#xff1a; 在不依赖Elasticsearch等外部搜索引擎的情况下&#xff0c;您依然能够充分利用MySQL数据库内置的LIKE和REGEXP操作符来实现高效的模糊匹配功能。针对更为复杂的搜索需求&#xff0c;尤其是在处理大型数据集时&#xff0c;结合使用IK分词器&#xff08;虽然IK…

ubuntu 通讯学习笔记

1.ubuntu ping6 详解 ping6 是用于测试IPv6网络连接的工具。在 Ubuntu&#xff08;以及其他 Linux 发行版&#xff09;中&#xff0c;你可以使用 ping6 命令来发送 ICMPv6 Echo 请求到指定的 IPv6 地址&#xff0c;以检测网络连接是否正常。 以下是 ping6 命令的一些基本用法…

git镜像链接

镜像链接https://registry.npmmirror.com/binary.html?pathgit-for-windows/ CNPM Binaries Mirror 1.git init 2.克隆 IDEA集成git git分支

Docker配置正向代理

服务器使用正向代理访问互联网&#xff0c;Docker 也需要配置使用这个代理。可以通过以下步骤配置 Docker 使用 HTTP 和 HTTPS 代理&#xff1a; 1. 配置 Docker 使用代理 创建或编辑 Docker 的配置文件 /etc/systemd/system/docker.service.d/http-proxy.conf 和 /etc/syste…

RDD算子---->coalesce和repartition的区别

1.coalesce() 作用&#xff1a;缩减分区数&#xff0c;用于大数据集过滤后&#xff0c;提高小数据集的执行效率。 需求&#xff1a;创建一个4个分区的RDD&#xff0c;对其缩减分区 #1.创建一个RDD rdd1 sc.parallelize(range(1,11),4) #2.对RDD重新分区 rdd2 rdd1.coalesc…

【CICID】GitHub-Actions-SpringBoot项目部署

[TOC] 【CICID】GitHub-Actions-SpringBoot项目部署 0 流程图 1 创建SprinBoot项目 ​ IDEA创建本地项目&#xff0c;然后推送到 Github 1.1 项目结构 1.2 Dockerfile文件 根据自身项目&#xff0c;修改 CMD ["java","-jar","/app/target/Spri…

【vuejs】vue2项目中封装组件的分析以及常用方式和属性讲解

1. 组件封装的目的与优势 1.1 提升开发效率 组件封装是Vue.js开发中的一种常见实践&#xff0c;其核心目的在于提高开发效率。通过将通用的功能和界面元素抽象成独立的组件&#xff0c;开发者可以在不同的项目和业务场景中重复使用这些组件&#xff0c;从而减少重复编写代码的…

国产精品ORM框架-SqlSugar详解 SqlSugar初识 附案例源码 云草桑 专题一

国产精品ORM框架-SqlSugar详解 1、SqlSugar初识 2、开始实操 3、增删改操作 4、进阶功能 5、集成整合 6、脚手架应用 sqlsugar 官网-CSDN博客 国产精品ORM框架-SqlSugar详解 SqlSugar初识 专题二-CSDN博客 1、SqlSugar初识 1.1 基本概念和历史 SqlSugar 是一款 老牌 …

vim网络和安全的操作及shell的使用

目录 vim模式 一般模式下的基本操作&#xff1a; 一般模式切换到编辑模式&#xff1a; 一般模式切换到命令模式&#xff1a; Vim多窗口使用技巧 横向切割打开&#xff1a; 纵向切割打开&#xff1a; 关闭多窗口&#xff1a; 窗口的切换&#xff1a; 网络&#xff1a;…

milvus分批写入测试数据

milvus分批写入测试数据 场景: 假如现在需要向milvus写入500W数据&#xff0c;调用milvus的insert api一次性写入500W数据是不现实的&#xff0c;内存也吃不消。 这时候需要分批写入&#xff0c;例如每次写入1000行&#xff0c;直至写完500W数据。 实现代码如下: package …

PostgreSQL 慢 SQL 排查

作者&#xff1a;文若 前言 所谓慢SQL 是指在数据库中执行时间超过指定阈值的语句。慢查询太多&#xff0c;对于业务而言&#xff0c;是有很大风险的&#xff0c;可能随时都会因为某种原因而被触发&#xff0c;并且根据我们的经验&#xff0c;数据库最常出现的问题&#xff0…

《大数据基础》相关知识点及考点,例题

1.6大数据计算模式 1、MapReduce可以并行执行大规模数据处理任务&#xff0c;用于大规模数据集&#xff08;大于1TB&#xff09;的并行运算。MapReduce 极大地方便了分布式编程工作&#xff0c;它将复杂的、运行于大规模集群上的并行计算过程高度地抽象为两个函数一一Map和Redu…

[MySQL][复核查询][多表查询][自连接][自查询]详细讲解

目录 1.铺垫&基本查询回顾1.多表查询1.何为笛卡尔积&#xff1f;2.示例 2.自连接1.何为自连接&#xff1f;2.示例 3.子查询1.何为子查询&#xff1f;2.单行子查询3.多行子查询4.多列子查询5.在from子句中使用子查询6.合并查询 1.铺垫&基本查询回顾 前面讲解的MYSQL表的…