Java课题笔记~ Spring 的事务管理

news2024/12/28 17:55:31

一、Spring 的事务管理

事务原本是数据库中的概念,在 Dao 层。但一般情况下,需要将事务提升到业务层,即 Service 层。这样做是为了能够使用事务的特性来管理具体的业务。

在 Spring 中通常可以通过以下两种方式来实现对事务的管理:

(1)使用 Spring 的事务注解管理事务

(2)使用 AspectJ 的 AOP配置管理事务

二、Spring 事务管理 API

Spring 的事务管理,主要用到两个事务相关的接口。

1、事务管理器接口(重点)

事务管理器是 PlatformTransactionManager 接口对象。

其主要用于完成事务的提交、回滚,及获取事务的状态信息。

 

A、 常用的两个实现类

PlatformTransactionManager 接口有两个常用的实现类

  • DataSourceTransactionManager:使用 JDBC 或 MyBatis 进行数据库操作时使用。

  • HibernateTransactionManager:使用 Hibernate 进行持久化数据时使用。

B、Spring 的回滚方式(理解)

Spring 事务的默认回滚方式是:发生运行时异常和 error 时回滚,发生受查(编译)异常时提交。不过,对于受查异常,程序员也可以手工设置其回滚方式。

C、回顾错误与异常(理解)

Throwable 类是 Java 语言中所有错误或异常的超类。只有当对象是此类 (或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java 的 throw 语句抛出。

Error:是程序在运行过程中出现的无法处理的错误,比如 OutOfMemoryError、ThreadDeath、NoSuchMethodError 等。当这些错误发生时,程序是无法处理(捕获或抛出)的,JVM 一般会终止线程。

Exception:程序在编译和运行时出现的另一类错误称之为异常,它是 JVM 通知程序员的一种方式。通过这种方式,让程序员知道已经或可能出现错误,要求程序员对其进行处理。

异常分为运行时异常与受查异常。

运行时异常:是 RuntimeException 类或其子类,即只有在运行时才出现的异常。如,NullPointerException、ArrayIndexOutOfBoundsException、 IllegalArgumentException 等均属于运行时异常。这些异常由JVM抛出,在编译时不要求必须处理(捕获或抛出)。但只要代码编写足够仔细,程序足够健壮,运行时异常是可以避免的。

【因此,运行时异常,也叫非受查异常,编译器无法检查到,需要程序员通过修改代码来解决】

受查异常【编译时异常】:即在代码编写时要求必须捕获或抛出的异常,若不处理,则无法通过编译。如 SQLException, ClassNotFoundException,IOException 等都属于受查异常。

RuntimeException 及其子类以外的异常,均属于受查异常。当然,用户自定义的 Exception 的子类,即用户自定义的异常也属受查异常。程序员在定义异常时,只要未明确声明定义的为 RuntimeException 的子类,那么定义的就是受查异常。

2、事务定义接口

事务定义接口 TransactionDefinition 中定义了事务描述相关的三类常量:

事务隔离级别、事务传播行为、事务默认超时时限,及对它们的操作。

 

1、事务隔离级别常量

A、 定义了五个事务隔离级别常量(掌握)

在应用程序中,多个事务并发运行,操作相同的数据,可能会引起脏读、不可重复读、幻读等问题。

(1)脏读(Dirty read):第一个事务访问并改写了数据,尚未提交事务,这时第二个事务进来了,读取了刚刚改写的数据,如果这时第一个事务回滚了,这样第二个事务读取到的数据就是无效的“脏数据”。

(2)不可重复读(Nonrepeatable read):第一个事务在其生命周期内多次查询同一个数据,在两次查询之间,第二个事务访问并改写了该数据,导致第一个事务两次查询同一个数据得到的结果不一样。

(3)幻读(Phantom read):幻读和不可重复读类似。它发生在第一个事务在其生命周期进行了两次按同一查询条件查询数据,第一次按该查询条件读取了几行数据,这时第二个事务进来了,且插入或删除了一些数据,然后第一个事务再次按同一条件查询,发现多了一些原本不存在的记录或者原有记录不见了。

为了解决并发问题,TransactionDefinition接口定义了5个事务隔离常量如下:

这些常量均是以 ISOLATION_开头。即形如 ISOLATION_XXX。

  1. ISOLATION_DEFAULT : 采用数据库默认的事务隔离级别 。MySql 的默认为 REPEATABLE_READ(可重复读); Oracle 默认为 READ_COMMITTED(读已提交)。 【REPEATABLE_READ存在幻读的情况,但MySQL的InnoDB解决了幻读】

  2. ISOLATION_READ_UNCOMMITTED:读未提交。允许另外一个事务读取到当前事务未提交的数据,隔离级别最低,未解决任何并发问题,会产生脏读,不可重复读和幻读。

  3. ISOLATION_READ_COMMITTED:读已提交。被一个事务修改的数据提交后才能被另外一个事务读取,另外一个事务不能读取该事务未提交的数据。解决脏读,但还存在不可重复读与幻读。

  4. ISOLATION_REPEATABLE_READ:可重复读。解决脏读、不可重复读,存在幻读 。

  5. ISOLATION_SERIALIZABLE:串行化读。按时间顺序一一执行多个事务,每次读都需要获得表级共享锁,读写相互都会阻塞,不存在并发问题,最可靠,但性能与效率最低。

从第2到第5,隔离级别越来越高。

2、事务传播行为常量

B、定义了七个事务传播行为常量(掌握)

所谓事务传播行为是指,处于不同事务中的方法在相互调用时,执行期间事务的维护情况(合并?互斥?)。如A 事务中的方法 doSome()调用 B 事务中的方法 doOther(),在调用执行期间事务的维护情况,就称为事务传播行为。事务传播行为是加在方法上的。

事务传播行为常量都是以 PROPAGATION_ 开头,形如 PROPAGATION_XXX。

  1. PROPAGATION_REQUIRED :必须包含事务(增删改必用)

  2. PROPAGATION_REQUIRES_NEW :自己新开一个事务,不管之前是否有事务

  3. PROPAGATION_SUPPORTS :支持事务,如果加入的方法有事务,则支持事务;如果没有,不单开事务

  4. PROPAGATION_NEVER :不能运行在事务中,如果包在事务中,抛异常

  5. PROPAGATION_NOT_SUPPORTED :不支持事务,运行在非事务环境中,如果加入的方法有事务,则会把事务先挂起【不常用】

  6. PROPAGATION_MANDATORY :必须包在事务中,没有事务则抛异常

  7. PROPAGATION_NESTED:嵌套事务

a、 PROPAGATION_REQUIRED:

指定的方法必须在事务内执行。若当前存在事务,就加入到当前事务中; 若当前没有事务,则创建一个新事务。这种传播行为是最常见的选择,也是 Spring 默认的事务传播行为。 如该传播行为加在 doOther()方法上。若 doSome()方法在调用 doOther() 方法时就是在事务内运行的,则 doOther()方法的执行也加入到该事务内执行。若 doSome()方法在调用 doOther()方法时没有在事务内执行,则 doOther()方法会创建一个事务,并在其中执行。

 

b、PROPAGATION_SUPPORTS

指定的方法支持当前事务,但若当前没有事务,也可以以非事务方式执行。

 

c、 PROPAGATION_REQUIRES_NEW

总是新建一个事务,若当前存在事务,就将当前事务挂起,直到新事务执行完毕。

 

3、事务默认超时时限常量

C、定义了默认事务超时时限

常量 TIMEOUT_DEFAULT 定义了事务底层默认的超时时限,及不支持事务超时时限设置的none值。

注意,事务的超时时限起作用的条件比较多,且超时的时间计算点较复杂。所以,该值一般就使用默认值即可。

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

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

相关文章

Java基础(七)排序算法

排序 1. 冒泡排序 >> 冒泡排序的思想 冒泡排序是一种简单的排序算法,其基本思想是通过多次遍历待排序序列,依次比较相邻的元素并交换位置,使得每次遍历后最大(或最小)的元素冒泡到序列的末尾。具体步骤如下&a…

一、 Mysql索引

一、 Mysql索引 001 Mysql如何实现的索引机制? MySQL中索引分三类:B树索引、Hash索引、全文索引 002 InnoDB索引与MyISAM索引实现的区别是什么? MyISAM的索引方式都是非聚簇的,与InnoDB包含1个聚簇索引是不同的。 在InnoDB存储引…

C++派生类的构造函数

1.构造函数 定义了派生类之后,要使用派生类就需要声明该类的对象。对象在使用之前必须初始化。 派生类的成员对象是由所有基类的成员对象共同组成的。因此构造派生类函数的对象时,就要对基类的成员对象和新增的成员对象进行初始化。 基类的构造函数并…

负载均衡–HAProxy安装及搭建tidb数据库负载服务

作为一名开发人员,随着经验的增加和技术的沉淀,需要提高自己架构方面的知识,同时对于一个企业来说,搭建一套高可用、高性能的技术架构,对于公司的业务开展和提高服务的性能也是大有裨益的。本文重点从软件安装和搭建ti…

数字体验监控 (DEM)解决方案

数字体验监控 (DEM) 是监控 Web 应用程序的前端和后端以确保无缝交付和最佳性能的过程,DEM 提供对业务应用程序可用性的洞察,可以对其进行分析以改善用户体验。 为什么数字体验监控很重要 在未确保最佳性能和适当行为的情况下向…

python实现对图油画、卡通、梦幻、草图、水彩效果

本篇博客将介绍如何使用wxPython模块和OpenCV库来实现对图像进行灰度化、二值化、伽马校正、色彩空间转换和图像反转这5种效果的合并程序。程序可以通过wxPython提供的GUI界面来选择图片路径和效果类型,程序会将处理后的图像保存到指定路径并打开。 步骤一&#xf…

W5500-EVB-PICO作为TCP Client 进行数据回环测试(五)

前言 上一章我们用W5500-EVB-PICO开发板通过DNS解析www.baidu.com(百度域名)成功得到其IP地址,那么本章我们将用我们的开发板作为客户端去连接服务器,并做数据回环测试:收到服务器发送的数据,并回传给服务器…

《吐血整理》高级系列教程-吃透Fiddler抓包教程(37)-掌握Fiddler中Fiddler Script用法你有多牛逼-下

1.简介 Fiddler是一款强大的HTTP抓包工具,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据. 使用Fiddler无论对开发还是测试来说,都有很大的帮助。Fiddler提供的功能基本上能…

在线高精地图生成算法调研

1.HDMapNet 整体的网络架构如图所示,最终的Decoder输出三个分支,一个语义分割,一个embedding嵌入分支,一个方向预测。然后通过后处理将这些信息处理成向量化的道路表示。 img2bev的方式之前有IPM,通过假设地面的高度都…

模仿火星科技 基于cesium+水平面积测量+可编辑

​ 当您进入Cesium的编辑水平积测量世界,下面是一个详细的操作过程,帮助您顺利使用这些功能: 1. 创建提示窗: 启动Cesium应用,地图场景将打开,欢迎您进入编辑模式。 在屏幕的一角,一个友好的提…

Linux6.34 Kubernetes yaml文件详解

文章目录 计算机系统5G云计算第三章 LINUX Kubernetes yaml文件详解一、yaml文件概述1.查看 api 资源版本标签2.写一个yaml文件demo 计算机系统 5G云计算 第三章 LINUX Kubernetes yaml文件详解 一、yaml文件概述 Kubernetes 支持 YAML 和 JSON 格式管理资源对象 JSON 格式…

ArcGIS Pro基础:【划分】工具实现等比例、等面积、等宽度划分图形操作

本次介绍【划分】工具的使用,如下所示,为该工具所处位置。使用该工具可以实现对某个图斑的等比例面积划分、相等面积划分和相等宽度划分。 【等比例面积】:其操作如下所示,其中: 1表示先选中待处理的图斑,2…

利用GPT打造你的博客|论文的专属讲解员→强制让GPT学习你的知识?(不需要魔法)

文章目录 1 前言2 搭建我的博客问答系统2.1 平台介绍(不需要魔法即可访问)2.2 前期准备2.3 上传博客作为数据集至Dify2.4 搭建你的博客回答专员 3 利用有针对性的GPT帮助我们阅读前沿论文4 结语 个人博客专属问答员:demo 1 前言 GPT是生成式…

React入门学习笔记3

事件处理 通过onXxx属性指定事件处理函数(注意大小写) React使用的是自定义(合成)事件, 而不是使用的原生DOM事件——为了更好的兼容性 eg:οnclick》onClickReact中的事件是通过事件委托方式处理的(委托给组件最外层的元素)——为了更高效通过event.target得到发生…

Go context.WithCancel()的使用

WithCancel可以将一个Context包装为cancelCtx,并提供一个取消函数,调用这个取消函数,可以Cancel对应的Context Go语言context包-cancelCtx 疑问 context.WithCancel()取消机制的理解 父母5s钟后出门,倒计时,父母在时要学习,父母一走就可以玩 …

视频怎么改成gif格式?简单几步就可以轻松视频转gif

平时我们使用的许多gif图片,其实都是视频片段,那么是怎么把视频转gif格式的呢?可以使用视频转gif工具来完成gif制作,下面就给大家分享一个简单的视频转gif在线制作(https://www.gif.cn)的方法,一…

pycharm离线安装依赖包

一、对于单个下载离线包,然后安装 1、先去https://pypi.org/网站下载离线包,下载到本地; 2、从磁盘中找到刚刚下载包,点击确定就可以安装了 二、将本地项目所有依赖包全部下载下来,然后批量在另一个项目&#xff…

Linux抓包工具----tcpdump

这是一个目录 一、什么是tcpdump二、为什么要用tcpdump三、tcpdump在哪里?四、怎么用tcpdump?4.1 命令格式4.2 常用选项4.2.1 对网络接口抓包 -i4.2.2 指定收取数据包的数量 -c4.2.3 不把ip转换成域名,直接显示ip -n4.2.4 显示ip和端口号 -nn…

权限校验—接口检验

一、背景介绍 最近项目中要实现根据不同用户去划分不同的角色,而不同角色具备调用不同接口的权限这个功能。用户在调用接口时需要校验用户是否具有权限访问接口,防止外界恶意调用随意篡改 二、思路&方案 为什么要进行接口鉴权? 接口鉴权…

几种常见的光纤接头有哪些?

名称: 光纤接头 光纤接头(optical fiber splice),将两根光纤永久地或可分离开地联结在一起,并有保护部件的接续部分,光纤接头是光纤的末端装置问题描述: 几种常见的光纤接头有哪些? 回答: 1.常见的光纤接头 LC 、SC 、FC 、ST、 MPO LC (Lucent connector) 小…