框架学习04-Spring 事务

1. 事务的基本概念

  • 定义:事务是一组数据库操作的集合,这些操作要么全部成功执行,要么全部不执行。它是为了保证数据的一致性和完整性。例如,在一个银行转账系统中,从一个账户扣款和向另一个账户收款这两个操作应该作为一个事务来处理。如果扣款成功但收款失败,就会导致数据不一致,而事务可以防止这种情况的发生。
  • 事务的特性(ACID)
    • 原子性(Atomicity):事务是一个不可分割的工作单位,事务中的操作要么全部执行,要么全部不执行。就像在上面的银行转账例子中,转账这个事务包含了两个操作,从账户A扣款和给账户B收款,这两个操作必须同时成功或者同时失败。
    • 一致性(Consistency):事务执行前后,数据库的完整性约束没有被破坏。在转账事务完成后,整个银行系统的资金总额应该保持不变,这就是保证了数据的一致性。
    • 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。例如,同时有多个用户进行转账操作,每个转账事务应该相互独立,互不干扰。
    • 持久性(Durability):一旦事务提交,它对数据库中数据的改变就应该是永久性的。即使系统出现故障,已经提交的事务的数据修改也不会丢失。

2. Spring Boot中的事务管理

  • 编程式事务管理
    • 方式:通过编写代码来手动控制事务的开启、提交和回滚。在Spring Boot中,可以使用PlatformTransactionManager接口来实现编程式事务管理。例如,以下是一个简单的示例代码:

      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.stereotype.Service;
      import org.springframework.transaction.PlatformTransactionManager;
      import org.springframework.transaction.TransactionStatus;
      import org.springframework.transaction.support.DefaultTransactionDefinition;
      @Service
      public class MyService {@Autowiredprivate PlatformTransactionManager transactionManager;public void doSomethingTransactional() {TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());try {// 业务逻辑代码,例如数据库操作//...transactionManager.commit(status);} catch (Exception e) {transactionManager.rollback(status);}}
      }
      
    • 缺点:这种方式代码比较繁琐,并且会将事务管理的代码和业务逻辑代码紧密耦合在一起,不利于代码的维护和扩展。

  • 声明式事务管理(推荐)
    • 方式:通过在方法或者类上添加注解来实现事务管理,这种方式更加简洁,将事务管理的代码和业务逻辑代码分离。在Spring Boot中,通常使用@Transactional注解来实现声明式事务管理。例如:

      import org.springframework.transaction.annotation.Transactional;
      import org.springframework.stereotype.Service;
      @Service
      @Transactional
      public class MyService {public void doSomethingTransactional() {// 业务逻辑代码,例如数据库操作// 这里的方法会自动被事务管理,当方法执行过程中出现异常时会自动回滚事务}
      }
      
      @Override@Transactional(propagation=Propagation.REQUIRED)public void saveUser(String userName,String userPwd){User user1=new User();user1.setUserName(userName);user1.setUserPwd(userPwd);userDao.saveUser(user1);userDao.delUserById(2);}
      
    • 传播行为@Transactional注解还可以指定事务的传播行为。传播行为定义了在一个已经存在事务的上下文中,事务方法应该如何执行。

      @Transactional(propagation=Propagation.REQUIRED)
      如果有事务, 那么加⼊事务, 没有的话新建⼀个(默认情况下)
      @Transactional(propagation=Propagation.NOT_SUPPORTED)
      容器不为这个⽅法开启事务
      @Transactional(propagation=Propagation.REQUIRES_NEW)
      不管是否存在事务,都创建⼀个新的事务,原来的挂起,新的执⾏完毕,继续执⾏⽼的事务
      @Transactional(propagation=Propagation.MANDATORY)
      必须在⼀个已有的事务中执⾏,否则抛出异常
      @Transactional(propagation=Propagation.NEVER)
      必须在⼀个没有的事务中执⾏,否则抛出异常(与 Propagation.MANDATORY 相反)
      @Transactional(propagation=Propagation.SUPPORTS)
      如果其他 bean 调⽤这个⽅法,在其他 bean 中声明事务,那就⽤事务.
      如果其他 bean 没有声明事务,那就不⽤事务.
      @Transactional(propagation=Propagation.NESTED)
      ⽀持当前事务,如果当前事务存在,则执⾏⼀个嵌套事务,如果当前没有事务,就新建⼀个事务。

    • 隔离级别:可以在@Transactional注解中指定事务的隔离级别,如READ_UNCOMMITTEDREAD_COMMITTEDREPEATABLE_READSERIALIZABLE。不同的隔离级别用于处理并发事务访问相同数据时可能出现的问题,如脏读、不可重复读和幻读。

    • 只读事务:如果一个事务只用于读取数据而不会修改数据,可以将事务标记为只读事务,通过设置@Transactional(readOnly = true)来提高性能。例如,一个查询数据库统计信息的方法可以设置为只读事务。

3. 事务的配置

  • 自动配置:Spring Boot在启动时会自动配置事务管理,只要在项目的依赖中包含了相关的数据库驱动和Spring Data JPA(或者其他支持事务管理的持久化框架),就可以直接使用事务管理功能。

  • 自定义配置: Spring 事务管理器的接⼝是org.springframework.transaction.PlatformTransactionManager,通过这个接⼝,Spring 为各个平台如 JDBC、Hibernate 等都提供了对应的事务管理器,但是具体的实现就是各个平
    台⾃⼰的事情了。此接⼝的内容如下:

    public interface PlatformTransactionManager(){ 
    // 由 TransactionDefinition 得到 TransactionStatus 对象 
    TransactionStatus getTransaction(TransactionDefinition definition) throws 
    TransactionException; 
    // 提交 
    void commit(TransactionStatus status) throws TransactionException; 
    // 回滚 
    void rollback(TransactionStatus status) throws TransactionException; 
    }
    

    如果需要自定义事务管理器,可以通过创建一个DataSourceTransactionManager(用于关系型数据库)或者其他类型的事务管理器(如JtaTransactionManager用于分布式事务),并将其配置为一个Bean。例如:

    import javax.sql.DataSource;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.transaction.PlatformTransactionManager;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    import org.springframework.transaction.jdbc.DataSourceTransactionManager;
    @Configuration
    @EnableTransactionManagement
    public class TransactionConfig {@Beanpublic PlatformTransactionManager transactionManager(DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}
    }
    

    这个配置类创建了一个DataSourceTransactionManager作为事务管理器,它需要一个DataSource作为参数,用于管理基于该数据源的事务。

  • 配置事务相关通知:⼀般来说增删改⽅法 propagation=Required,对于查询⽅法使⽤ read-only=“true”

    <!- tx:method的属性: name 是必须的,表示与事务属性关联的⽅法名(业务⽅法名),对切⼊点进⾏细化。
    通配符()可以⽤来指定⼀批关联到相同的事务属性的⽅法。 如:'get’、‘handle*’、'on*Event’等等.
    propagation 不是必须的,默认值是REQUIRED 表示事务传播⾏为, 包括:
    REQUIRED,SUPPORTS,MANDATORY,NEVER REQUIRES_NEW,NOT_SUPPORTED,NESTED
    isolation 不是必须的,默认值DEFAULT 表示事务隔离级别(数据库的隔离级别) timeout
    不是必须的,默认值-1(永不超时) 表示事务超时的时间(以秒为单位) read-only 不是必须的,默认值false不是只读的
    表示事务是否只读 rollback-for 不是必须的 表示将被触发进⾏回滚的 Exception(s);以逗号分开。
    如:‘com.foo.MyBusinessException,ServletException’ no-rollback-for
    不是必须的 表示不被触发进⾏回滚的 Exception(s);以逗号分开。
    如:‘com.foo.MyBusinessException,ServletException’ 任何 RuntimeException
    将触发事务回滚–>

     <tx:advice id="txAdvice" transaction-manager="txManager"><!--对以add update delete query开头的所有⽅法进⾏事务处理--><tx:attributes><!--定义什么⽅法需要使⽤事务  name代表的是⽅法名(或⽅法匹配)--><!-- 匹配以 add 开头的所有⽅法均加⼊事务 --><tx:method name="add*" propagation="REQUIRED" /><!-- 匹配以 update 开头的所有⽅法均加⼊事务 --><tx:method name="update*" propagation="REQUIRED" /><!-- 匹配以 delete 开头的所有⽅法均加⼊事务 --><tx:method name="delete*" propagation="REQUIRED" /><!-- 匹配以 query 开头的所有⽅法均加⼊事务 --><tx:method name="query*" read-only="true" /></tx:attributes></tx:advice>
    

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

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

相关文章

【学术会议介绍,SPIE 出版】第四届计算机图形学、人工智能与数据处理国际学术会议 (ICCAID 2024,12月13-15日)

第四届计算机图形学、人工智能与数据处理国际学术会议 2024 4th International Conference on Computer Graphics, Artificial Intelligence and Data Processing (ICCAID 2024) 重要信息 大会官网&#xff1a;www.iccaid.net 大会时间&#xff1a;2024年12月13-15日 大会地…

【go从零单排】Command-Line Flags、Command-Line Subcommands命令行和子命令

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 在 Go 语言中&#xff0c;命令行标志&#xff08;Command-Line Flags&#xff09…

WEB攻防-通用漏洞SQL读写注入MYSQLMSSQLPostgraSQL

知识点&#xff1a; 1、SQL注入-MYSQL数据库&#xff1b; 2、SQL注入-MSSQL数据库&#xff1b; 3、SQL注入-PostgreSQL数据库&#xff1b; 首先要找到注入点 详细点&#xff1a; Access无高权限注入点-只能猜解&#xff0c;还是暴力猜解 MYSQL&#xff0c;PostgreSQL&am…

自定义springCloudLoadbalancer简述

概述 目前后端用的基本都是springCloud体系&#xff1b; 平时在dev环境开发时&#xff0c;会把自己的本地服务也注册上去&#xff0c;但是这样的话&#xff0c;在客户端调用时请求可能会打到自己本地&#xff0c;对客户端测试不太友好. 思路大致就是前端在请求头传入指定ip&a…

腾讯云11.11云服务器活动--上云拼团GO

目录 云服务器活动介绍&#xff1a; 轻量服务器 上GO拼团领券 云服务器购买 HAI现金券 学生专享GPU 活动总结 云服务器活动介绍&#xff1a; 双十一临近,这是您一年中最期待的购物狂欢时刻。作为国内领先的云计算服务商,腾讯云诚挚为您呈献前所未有的优惠福利,助您在这…

防脱生发最有效的产品,测评总结早看少踩雷

别人脱单、脱贫你脱发&#xff0c;就问你心酸不心酸&#xff1f;探索防脱之路确实不易&#xff0c;到底怎么才能有效防脱养发呢&#xff0c;很有必要分享一下我多年的防脱心得&#xff0c;这几款一直在用的防脱育发好物&#xff0c;秃头朋友们可以看看~ **露卡菲娅防脱精华液**…

c++:string(一)

文章目录 一string类1C语言中的字符串2C中的string二遍历1[ ]2迭代器3const迭代器4范围for5auto6总结三String的尾插1size和length2max_size,capacity和clear3访问接口4尾插字符和字符串5 append的重载三string的扩容问题&#xff08;1&#xff09;怎么扩容&#xff08;2&#…

【2048】我的创作纪念日

机缘 2048天&#xff0c;不知不觉来csdn博客已经有2048天了&#xff0c;其实用csdn平台很久了&#xff0c;实际上写博客还是从2019年开始。 还记得最初成为创作者初心是什么吗&#xff1f; 最开始&#xff0c;主要是用来做笔记。平时工作中、学习中遇到的技术相关问题都会在cs…

壁仞科技上市前最后一波 校招 社招 内推

随着美国大选结束&#xff0c;国内GPU 产业得到空前的的发展空间&#xff0c;国内芯片相关股票一片飘红。 国内大型 GPU厂商壁仞科技&#xff0c;摩尔线程等正紧锣密鼓地加紧上市。 GPGPU 芯片赛道来到了史无前例的红利点&#xff0c;抓住机会&#x1f4aa; 壁仞科技正在火热…

sql server 自动kill 查询超过20分钟的语句

起源于同事的烂sql 容易拖垮 数据服务器&#xff0c; 周末没有人监控数据库&#xff0c;好几次导致主从数据库同步失败 &#xff0c;不得不自动kill 烂sql 语句如下 &#xff1a; -- 声明变量来存储超过20分钟的查询的会话ID DECLARE kill_sessions TABLE (session_id INT); …

GMS地下水数值模拟、全流程各工程类型地下水环境影响评价、MODFLOW Flex

GMS地下水数值模拟技术及在地下水环评中的应用 以地下水数值模拟软件GMS10.1操作为主要内容&#xff0c;在教学中强调三维地质结构建模、水文地质模型概化、边界条件设定、参数反演和模型校核等关键环节。不仅使学员掌握地下水数值模拟软件GMS10.1的全过程实际操作技术的基本技…

基于Multisim水箱水位控制系统仿真电路(含仿真和报告)

【全套资料.zip】水箱水位控制系统仿真电路Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 1.在水箱内的不同高度安装3根金属棒&#xff0c;以感知水位变化情况&#xff0c; 液位分1&…

IPguard与Ping32全面对比——选择最适合企业的数据安全解决方案

在如今数据安全威胁日益加剧的时代&#xff0c;企业必须高度重视保护敏感数据与信息。因此&#xff0c;选择一款合适的数据安全软件&#xff0c;尤其是防泄密和信息保护软件&#xff0c;显得尤为重要。在市场上&#xff0c;有两款备受企业青睐的数据安全解决方案——IPguard和P…

Chrome使用IE内核

Chrome使用IE内核 1.下载扩展程序IE Tab 2.将下载好的IE Tab扩展程序拖拽到扩展程序界面&#xff0c;之后重启chrome浏览器即可

秒级响应与低成本实现!TDengine 助力多元量化交易系统的背后故事 | 征文

小T导读&#xff1a;在不久前的“2024&#xff0c;我想和 TDengine 谈谈”征文活动中&#xff0c;我们收到了许多精彩的投稿&#xff0c;反映了用户与 TDengine 之间的真实故事和独特见解。今天&#xff0c;我们很高兴地分享此次活动的第一名作品。这篇文章详细阐述了广西多元量…

【nginx】client timed out和send_timeout的大小设置

websocket连接会断开&#xff0c;抓包检查后发现是中间的代理服务器nginx断开的&#xff0c;同时将后端和浏览器都断开了。将nginx日志调到debug级别后&#xff0c;有下面的断开信息。 [info] 125923#125923: *34 client timed out (110: Connection timed out) while proxyin…

什么是RAG? LangChain的RAG实践!

1. 什么是RAG RAG的概念最先在2020年由Facebook的研究人员在论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》中提出来。在这篇论文中他们提出了两种记忆类型&#xff1a; 基于预训练模型&#xff08;当时LLM的概念不像现在这么如日中天&#xff0…

A027-基于Spring Boot的农事管理系统

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

13. 基于yolov8苹果叶片病害识别系统(含UI界、Python代码、训练好的模型、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下&#xff1a; 算法模型&#xff1a;     yolov8、yolov8 SE注意力机制 或 yolov5、yolov5 SE注意力机制 &#xff0c; 直接提供最少两个训练好的模型。模型十分重要&#xff0c;因为有些同学的电脑没有 GPU&#xff0…

新的服务器Centos7.6 安装基础的环境配置(新服务器可直接粘贴使用配置)

常见的基础服务器配置之Centos命令 正常来说都是安装一个docker基本上很多问题都可以解决了&#xff0c;我基本上都是通过docker去管理一些容器如&#xff1a;mysql、redis、mongoDB等之类的镜像&#xff0c;还有一些中间件如kafka。下面就安装一个 docker 和 nginx 的相关配置…