Spring事务管理

news2024/9/20 15:00:43

认识事务

  • 可以把一系列(多条sql语句)要执行的操作称为事务,而事务管理就是管理这些操作要么完全执行要么完全不执行(很经典的一个例子是:A要给B转钱,首先A的钱减少了,但是突然的数据库断电了,导致无法给B加钱,然后由于丢失数据,B不承认收到A的钱;在这里事务就是确保加钱和减钱两个都完全执行或完全不执行,如果加钱失败,那么不会发生减钱)。

事务管理的意义:

  • 保证数据操作的完整性和安全性。

事务管理的四大特性: - 记住 - ACID

  • 原子性:事务的整个操作是一个整体,不可以分割,要么全部成功,要么全部失败。
  • 一致性:事务操作的前后,数据表中的数据没有变化。
  • 隔离性:事务操作是相互隔离不受影响的。
  • 持久性:数据一旦提交,不可改变,永久的改变数据表数据。

事务管理操作:

  • 开启事务管理:开启之后,下面的sql语句并不会马上执行并把结果写到表中,而是会写到事务日志中。
  • start transaction;
  • 回滚操作:会清掉开始事务管理之后写到事务日志中的内容,即恢复到开启事务管理之前。
  • 语法:rollback; - 如果程序发生了异常,将数据恢复到没有操作之前的那个状态。
  • 注意:回滚操作只是回退"写"的内容,对于普通的读表select语句不能回退。
  • 事务提交:将sql语句的结果写到数据表中。
  • 语法:commit: - 持久化的保存
  • 当 commit 或 rollback 语句执行后,事务会自动关闭

Spring事务管理机制

  • Spring事务管理 由三个接口共同完成 :
  • lPlatformTransactionManager 平台相关事务管理器  - 事务管理器
  • lTransactionDefinition 事务定义信息 (通过配置如何进行事务管理:隔离、传播、超时、只读)
  • lTransactionStatus 事务状态 (事务管理过程中,每个时间点事务 状态信息 )

PlatformTransactionManager 事务管理器

  • 提交事务 commit、回滚事务 rollback、 获取事务状态 getTransaction

  • lDataSourceTransactionManager 针对 JdbcTemplate、MyBatis 事务控制 ,使用Connection进行事务控制
  • 开启事务 conn.setAutoCommit(false);
  • 提交事务 conn.commit();
  • 回滚事务 conn.rollback();
  • lHibernateTransactionManager 针对Hibernate框架进行事务管理, 使用Session的Transaction相关操作进行事务控制
  • 开启事务 session.beginTransaction();
  • 提交事务 session.getTransaction().commit();
  • 回滚事务 session.getTransaction().rollback();
  • 用户应该选择和使用持久层技术,对应的事务管理器

TransactionDefinition 事务定义信息

  • 隔离级别获取 getIsolationLevel 、 传播行为获取 getPropagationBehavior 、 获取超时时间getTimeout 、isReadOnly 是否只读  

事务的隔离级别  

  • 事务四大特性 ACID --- 隔离性引发问题 ---- 解决事务的隔离问题--隔离级别
    •  Mysql 默认隔离级别 REPEATABLE_READ
    •  Oracle 默认隔离级别 READ_COMMITTED

 事务的传播行为

  • 什么是事务的传播行为? 为什么需要 ?
  • 事务传播行为用于解决两个被事务管理的方法互相调用问题

 

  • REQUIRED、SUPPORTS、MANDATORY : 支持当前事务, A调用B,如果A事务存在,A和B处于同一个事务 (事务默认传播行为 REQUIRED )
  • REQUIRES_NEW、NOT_SUPPORTED、NEVER : 不会支持原来的事务 ,A调用B, 如果A事务存在, B肯定不会和A处于同一个事务
  •  NESTED: 嵌套事务 ,只对DataSourceTransactionManager有效 ,底层使用JDBC的SavePoint机制,允许在同一个事务设置 保存点,回滚保存点

面试题:REQUIRED、REQUIRES_NEW、NESTED 区分

  • REQUIRED 一个事务
  •  REQUIRES_NEW 两个事务
  •  NESTED 一个事务,事务可以设置保存点,回滚到保存点 ,选择提交或者回滚

 TransactionStatus 事务状态

  • 事务运行过程中,每个时间点 事务状态信息 !
  • 事务的结束必须通过commit , rollback 作用标记为回滚
     try {
          操作
	commit
     } catch (){
          rollback
     } 

三个对象之间的关系:

  • 用户管理事务,需要先配置事务管理方案TransactionDefinition、 管理事务通过TransactionManager 完成,TransactionManager根据 TransactionDefinition进行事务管理,在事务运行过程中,每个时间点都可以通过获取TransactionStatus 了解事务运行状态!

Spring事务管理两种方式

  • Spring支持两种事务管理: 编程式事务管理、 声明式事务管理  - 支持
  • l编程式事务管理: 要修改原来的代码,加入事务管理代码 (侵入性 )--- 不推荐,不使用
  • 实际中是通过TransactionTemplate 操作事务管理
     template.execute(new TransactionCallbackWithoutResult(){
          void doInTransactionWithoutResult(TransactionStatus status) {
                // 需要事务管理的代码 
       }
	});
  • l声明式事务管理: 底层就是AOP的环绕通知, --- 推荐

声明式事务管理案例 

编写转账案例,引出事务管理问题

  • 第一步:建立数据表
  • 第二步: 编写转账代码
  • 第三步: 编写测试

 XML配置方式添加事务管理(tx、aop约束)

第一步: 引入aop和tx 的名称空间,导入aop和tx  的jar

  • <beans xmlns="http://www.springframework.org/schema/beans"
  • xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  • xmlns:context="http://www.springframework.org/schema/context"
  • xmlns:aop="http://www.springframework.org/schema/aop"
  • xmlns:tx="http://www.springframework.org/schema/tx"
  • xsi:schemaLocation="http://www.springframework.org/schema/beans
  • http://www.springframework.org/schema/beans/spring-beans.xsd
  • http://www.springframework.org/schema/context
  • http://www.springframework.org/schema/context/spring-context.xsd
  •    http://www.springframework.org/schema/aop
  • http://www.springframework.org/schema/aop/spring-aop.xsd
  •       http://www.springframework.org/schema/tx
  • http://www.springframework.org/schema/tx/spring-tx.xsd">

第二步: 配置 transactionManager(spring提供 Around 通知 )

  • 根据不同的持久层框架,配置不同的事务管理器,事务管理器需要依赖数据源信息

第三步: 配置切入点和切面

  • 在spring的配置文件中,使用<tx:advice>配置通知信息,其实就是哪些需要方法需要增强,事务管理也是aop的应用
	<tx:advice>
	       <tx:attributes>
	           <tx:method name="具体的方法名"/>
	       </tx:attributes>
	   </tx:advice>
  • 使用aop:config来配置切入点和切面信息
	aop:pointcut 配置切入点, id=""起个名字,expression="" 配置切入点表达式
	aop:advisor 配置切面,advice-ref="" pointcut-ref="" 将切入点和通知整合到一起

 注解配合方式添加事务管理@Transactional

  • 第一步: 配置注解驱动事务管理
  • 第二步: 在需要管理事务的方法或者类上面 添加@Transactional 注解

小结

  • 问题: XML配置方式和注解配置方式 进行事务管理 哪种用的多?
  • XML方式 和注解都在使用
  • 使用@Transactional注解进行事务管理,方便,不过配置太分散, 使用XML进行事务管理 属性集中配置,便于管理和维护 

 

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

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

相关文章

EMQX数据流转MySQL踩坑日记:EMQX VER 4.2.3

总结&#xff1a; &#xff08;0&#xff09;数据库报错问题&#xff0c;详细参考这篇文档&#xff0c;链接&#xff0c;ln -s 源 目标 https://blog.csdn.net/weixin_42110159/article/details/118945136 &#xff08;1&#xff09;数据库建立数据&#xff0c;要注意大小写&am…

数字化开采|AIRIOT智慧矿山自动化生产解决方案

由于矿山地形复杂&#xff0c;生产自动化水平低&#xff0c;安全监管技术落后&#xff0c;事故频发等很多因素对煤矿开采技术提出了数据化、可视化、智能化的要求。通过目前的煤矿开采现状可以发现煤矿开采过程中&#xff0c;在生产、监管、巡检、安全、效率等方面还存在许多有…

图文详解Linux基础经典教程(08)——CentOS安装MySQL数据库

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 概述 之前&#xff0c;我们在CentOS中安装了JDK、Tomcat&#xff1b;接下来&#xff0c;我们在CentOS中采用YUM的方式安装MySQL5.6数据库。 安装前准备工作 在此&#xf…

面试常用算法归纳

最长子串、子序列 先说明下子串和子序列的问题&#xff1a;对于s “pwwkew"来说&#xff0c;其中一个子串为"wke”&#xff0c;而"pwke" 是一个子序列。 子序列&#xff1a;一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改…

基于Matlab通用视频处理系统的设计-含Matlab代码

⭕⭕ 目 录 ⭕⭕⏩ 一、引言⏩ 二、系统总体方案设计⏩ 2.1 方案设计⏩ 2.2 界面设计⏩ 三、实例分析⏩ 四、参考文献⏩ 五、Matlab程序获取⏩ 一、引言 随着信息技术的发展&#xff0c;基于视频图像中对感兴趣的目标提取&#xff0c;已经逐渐渗透到人们生活的方方面面&#x…

[附源码]SSM计算机毕业设计“拥抱爱心”公益网站管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

VMware Workstation 与 Device/Credential Guard 不兼容问题

系列文章目录 VMware Workstation 与 Device/Credential Guard 不兼容问题 VMware Workstation 与 Device/Credential Guard 不兼容问题系列文章目录一、原因二、解决办法2.1修改虚拟化安全设备为禁用2.2HV主机服务启动类型设置 为 “禁用”2.3关闭 Hyper-V 并且打开虚拟机平台…

CUDA By Example(六)——纹理内存

在本章中&#xff0c;我们将学习如何分配和使用纹理内存(Texture Memory)。和常量内存一样&#xff0c;纹理内存是另一种类型的只读内存&#xff0c;在特定的访问模式中&#xff0c;纹理内存同样能够提升性能并减少内存流量。虽然纹理内存最初是针对传统的图形处理应用程序而设…

Linux学习-43-挂载Linux系统外的文件mount和卸载文件系统umount命令用法

10.10 mount命令详解&#xff1a;挂载Linux系统外的文件 所有的硬件设备必须挂载之后才能使用&#xff08;新硬盘先格式化后创建分区&#xff0c;再对分区进行挂载&#xff09;&#xff0c;只不过&#xff0c;有些硬件设备&#xff08;比如硬盘分区&#xff09;在每次系统启动…

记录一次我虚拟机好不容易连上后的配置

有一说一&#xff0c;看到这个响应&#xff0c;人都麻了 在此我记录一下我检查了哪些&#xff0c;做了哪些 一、Windows本地服务 这一块&#xff0c;有一个算一个&#xff0c;没起的启动&#xff0c;启动的重启 二、VMware的虚拟网络编辑器设置 因为我这次成功用的是NAT模式&a…

图像分割 - 阈值处理 - 多阈值处理(OTSU)

目录 1. 多阈值处理介绍 2. 代码讲解 3. 完整代码 1. 多阈值处理介绍 之前介绍的都是全局单个阈值对图像的分割。固定阈值法&#xff0c;阈值是人工根据灰度直方图的波谷进行设置的。全局阈值法&#xff0c;根据不停的迭代两个区域间的平均灰度进行分割。OUST最大类间方差法…

centos7 环境安装 PM2 管理 node

前言&#xff1a; 由于最新的项目中用到的框架是 ssr 框架。 Vue使用的ssr是 nuxt.js&#xff0c;由于 nuxt.js 和普通的Vue项目不同&#xff0c;所以部署到Linux服务器的方式和普通的Vue项目是有区别的。 1、PM2 介绍 PM2 是一款非常优秀的 Node 进程管理工具&#xff0c;它…

用于科学研究的TCO反式环辛烯:1312010-03-9,(4E)-TCO-CycP-O-PNB ester

(4E)-TCO-CycP-O-PNB ester物理数据&#xff1a; CAS&#xff1a;1312010-03-9| 中文名&#xff1a;(4E)-反式环辛烯-CycP-O-PNB ester&#xff0c; (4E)-反式环辛烯-CYCP-O-PNB-酯 | 英文名&#xff1a;(4E)-TCO-CycP-O-PNB ester 结构式&#xff1a; 英文别名&#xff1a; …

试用信号灯实现如图所示的进程同步关系

试用信号灯实现如图所示的进程同步关系 信号量的个数要等于具有直接前驱的进程个数 P2,P3,P4,P5这些进程有前驱&#xff0c;所以设S2S3S4S50 因为P1执行完&#xff0c;P2,P3,P4才能执行因为P1没有直接前驱&#xff0c;所以直接释放P2.P3.P4的信号量S2,S3,S4P1{V(S2)V(S3)V(…

03-HTML

1 HTML入门 1.1 初识HTML 1.1.1 概述 网络世界已经跟我们息息相关&#xff0c;当我们打开一个网站&#xff0c;首先映入眼帘的就是一个个华丽多彩的网页。这些网页&#xff0c;不仅呈现着基本的内容&#xff0c;还具备优雅的布局和丰富的动态效果&#xff0c;这一切都是如何…

图像分割简介

相比于目标检测只是将目标位置检测出来而言&#xff0c;目标分割能够更精准的将图像进行划分。图像分割在计算机视觉中的地位 为后续检测、识别等提供技术支持。 图像分割难点以及处理 难点&#xff1a;图像特征的组合难以表达&#xff1f; 比如 图中人的头发和裤子是黑色&a…

《FFmpeg Basics》中文版-10-为视频添加文字

正文 视频中包含的文本数据可以显着提高其信息质量。 在视频中添加文字的相关介绍 如何将一些文本添加到视频输出中的两种常用方法是使用前一章中的字幕或叠加技术(overlay)。 具有许多可能性的最高级选项是使用表中描述的抽象滤镜&#xff1a; 描述从文本文件或字符串在视频…

成像雷达量产突破:木牛携手全球合作伙伴突破智驾瓶颈

时隔三年的全球工程机械行业大展&#xff0c;第33届2022德国慕尼黑Bauma展&#xff0c;于近期圆满收官。作为2022年为数不多的全球性展会&#xff0c;吸引了60多个国家和地区的3100余家工程机械企业聚首&#xff0c;行业新品竞相角逐&#xff0c;数字智能化的创新产品成为本次展…

最近公共祖先(lca)

题目描述 如题&#xff0c;给定一棵有根多叉树&#xff0c;请求出指定两个点直接最近的公共祖先。 输入格式 第一行包含三个正整数 N,M,S&#xff0c;分别表示树的结点个数、询问的个数和树根结点的序号。 接下来 N−1 行每行包含两个正整数 x,y&#xff0c;表示 x 结点和 y 结…

[附源码]java毕业设计景区门票系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…