5 Spring 事务管理

目录

1.概述

2.事务特性:ACID

3.Spring 框架的事务管理支持两种方式

编程式事务

申明式事务

4.Spring 事务管理 API

事务管理器接口

Spring 的回滚方式

事务定义接口

事务的四种隔离级别

事务的七种传播行为

5.事务注解例子:

@Transactianal 注解有一些属性


1.概述

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

2.事务特性:ACID

  • 原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
  • 一致性(Consistency):事务前后数据的完整性必须保持一致。
  • 隔离性(Isolation):事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
  • 持久性(Durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

3.Spring 框架的事务管理支持两种方式

编程式事务

编程式事务就是指通过在代码中嵌入事务控制代码来手动控制事务,这个方式的优点是可以在方法体中的代码块级别进行控制事务,粒度较细,缺点是要侵入我们的业务代码,不推荐使用。

申明式事务

申明式事务是基于 Spring 的框架 AOP 技术,把事务当做一个“切面”,在需要做事务控制的代码上织入,可以控制到方法层面,其优点是无需侵入目标代码,而且 Spring 针对不同的底层持久层实现提供了不同的事务管理 API ,非常方便。

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

  • 使用 Spring 的事务代理工厂管理事务(已过时)
  • 使用 Spring 的事务注解管理事务
  • 使用 AspectJ 的 AOP 配置管理事务

4.Spring 事务管理 API

下面的图示可以很清晰地展示 Spring 框架的事务 API 结构:

事务管理器接口

PlatformTransactionManager:是事务管理器接口对象。其主要用于完成事务的提交、回滚,及获取事务的状态信息。该接口定义了 3 个事务方法:

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

Spring并不直接管理事务,而是提供了多种事务管理器,常用的两个实现类:

  • DataSourceTransactionManager:使用 JDBC 或 MyBatis 进行持久化数据时使用。

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

Spring 的回滚方式

Spring 事务的默认回滚方式是:发生运行时异常回滚

例子:

  • 多个异常类型,用数组:@Transactional(rollbackFor={IOException.class,FileNoteFoundException})
  • 如果要指定遇到几个 RuntimeException 的时候不回滚:@Transactional(noRollbackFor={NullPointerException.class,IndexOutOfBoundsException.class})

事务定义接口

事务定义接口 TransactionDefinition 中定义了事务描述相关的三类常量:事务隔离级别(isolation)事务传播行为(propagation)事务默认超时时限,及对它们的操作。

事务的四种隔离级别
  • DEFAULT:采用 DB 默认的事务隔离级别。MySql 默认为 REPEATABLE_READ;Oracle 默认为:READ_COMMITTED;
  • READ_UNCOMMITTED:读未提交。未解决任何并发问题。
  • READ_COMMITTED:读已提交。解决脏读,存在不可重复读与幻读。
  • REPEATABLE_READ:可重复读。解决脏读、不可重复读。存在幻读。
  • SERIALIZABLE:串行化。不存在并发问题。

例子:属性 isolation
事务隔离级别是数据库的概念,在多个事务对一批记录进行操作的时候,可能出现各种冲突的情况该属性的可能值有:

  • Isolation.DEFAULT:数据库默认隔离级别

  • Isolation.READ_UNCOMMITED:读未提交。可以读到其他事务未提交的数据。导致脏读(dirty read)

  • Isolation.READ_COMMITED:读已提交。这是很多数据库的默认隔离级别,但不是 MySQL 的。不能读到其他事务未提交的数据,只能读到已提交的数据。解决了脏读,可导致不可重复读和幻读。

    • 不可重复读:在预读之后,commit 之前,其他事务更新了数据,导致两次读到的数据不相同
    • 幻读:在预读之后,commit 之前,其他事务插入数据,导致两次读到的数据条数不相同
  • Isolation.REPEATABLE_READ:可重复读。这是 MySQL 的默认事务隔离级别。解决了脏读,不可重复读,但依然存在幻读问题。

  • Isolation.SERIALIZABLE:可串行化。最高的事务隔离级别。解决了脏读、不可重复读、幻读,但导致大量的超时和锁竞争。

事务的七种传播行为

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

  • REQUIRED:指定的方法必须在事务内执行。若当前存在事务,就加入到当前事务中;若当前没有事务,则创建一个新事务。这种传播行为是最常见的选择,也是 Spring 默认的事务传播行为。
  • SUPPORTS:指定的方法支持当前事务,但若当前没有事务,也可以以非事务方式执行。
  • MANDATORY:指定的方法必须在当前事务内执行,若当前没有事务,则直接抛出异常。
  • REQUIRES_NEW:总是新建一个事务,若当前存在事务,就将当前事务挂起,直到新事务执行完毕。
  • NOT_SUPPORTED:指定的方法不能在事务环境中执行,若当前存在事务,就将当前事务挂起。
  • NEVER:指定的方法不能在事务环境下执行,若当前存在事务,就直接抛出异常。
  • NESTED:指定的方法必须在事务内执行。若当前存在事务,则在嵌套事务内执行;若当前没有事务,则创建一个新事务。

例子:属性 propagation

A.f1() 有事务 A

B.f2() 有事务 B

当 A.f1() 调用 B.f2() 的时候,B.f2() 中的代码执行哪个事务
该属性可能的值有(以下属性值加在 B.f2() 上来理解):

  • Propagation.REQUIRED:如果 A.f1() 调用 B.f2() ,那么执行 A 事务;如果 A 没有事务,那就执行自己的事务 B 。接受,给就收下,不给就用自己的。
  • Propagation.SUPPORTS:如果 A.f1() 调用 B.f2(),那么执行 A 事务;如果被没有事务的方法调用,那么就在没有事务的环境下执行。接受,给就收下,不给也不要。
  • Propagation.MANDATORY:B.f2() 不能开启自己的事务,只能被开启了事务的 A.f1() 调用,如果被没有开启事务其他的方法调用,则抛异常。自己没有,给,必须给,不给就哭。
  • Propagation.REQUIRES_NEW:如果 A.f1() 调用 B.f2() ,那么事务 A 被挂起,重新创建一个事务 B ,B.f2() 在事务 B 中执行,B 执行完毕再继续 A 事务。接受,给的不收,用自己的。
  • Propagation.NOT_SUPPORTED:B.f2() 不需要在事务中执行。如果被需要事务 A 的 A.f1() 调用,那么事务 A 被挂起,B.f2() 执行完毕 A 才恢复。不接受,硬给也不收。
  • Propagation.NEVER:B.f2() 不能在任何事务下执行,如果 A.f1() 调用它,那么抛异常。绝不接受,硬给就拼命。
  • Propagation.NESTED:如果 A.f1() 调用 B.f2() ,那么 B 嵌套在 A 中执行,形成嵌套事务。

5.事务注解例子:

@Transactianal 注解有一些属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//控制事务传播。默认是Propagation.REQUIRED
@Transactional(propagation=Propagation.REQUIRED)  


//控制事务隔离级别。默认跟数据库的默认隔离级别相同
@Transactional(isolation=Isolation.DEFAULT)        


//控制事务可读写(默认可读写)
@Transactional(readOnly=false)

//只可读,这样可以节约一些资源开销
@Transactional(readOnly=true)


//控制事务的超时时间,单位秒。默认跟数据库的事务控制系统相同,又说是30秒
@Transactional(timeout=30)        


//控制事务遇到哪些异常才会回滚。默认是RuntimeException
@Transactional(rollbackFor=RuntimeException.class) 

//同上
@Transactional(rollbackForClassName=RuntimeException)


//控制事务遇到哪些异常不会回滚。默认遇到非RuntimeException不会回滚
@Transactional(noRollbackFor=NullPointerException.class)   


//同上
@Transactional(noRollbackForClassName=NullPointerException)

注意@Transactional 应当添加在具体的实现类而不是接口上

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

中间件之异步通讯组件RabbitMQ进阶

这里我们必须尽可能确保MQ消息的可靠性,即:消息应该至少被消费者处理1次 那么问题来了: 我们该如何确保MQ消息的可靠性? 如果真的发送失败,有没有其它的兜底方案? 首先,我们一起分析一下消息…

多模态大模型MLLM VIT CLIP BLIP

一、Vit模型介绍 Vit(Vision Transformer)即将Transformer应用于视觉领域。 Transformer输入输出都是一个序列,若需要应用于视觉领域,则需要考虑如何将一个2d图片转化为一个1d的序列,最直观的想法将图片中的像素点输…

Logit Standardization in Knowledge Distillation 知识蒸馏中的logit标准化

摘要 知识蒸馏涉及使用基于共享温度的softmax函数将软标签从教师转移到学生。然而,教师和学生之间共享温度的假设意味着他们的logits在logit范围和方差方面必须精确匹配。这种副作用限制了学生的表现,考虑到他们之间的能力差异,以及教师天生…

旺店通·企业奇门和金蝶云星空单据接口对接

旺店通企业奇门和金蝶云星空单据接口对接 源系统:金蝶云星空 金蝶K/3Cloud(金蝶云星空)是移动互联网时代的新型ERP,是基于WEB2.0与云技术的新时代企业管理服务平台。金蝶K/3Cloud围绕着“生态、人人、体验”,旨在帮助企业打造面向…

Web3 ETF软件开发

开发Web3 ETF软件涉及到金融、法律和技术等多个领域的专业知识,因此存在以下技术难点,开发Web3 ETF软件是一项复杂的技术挑战,需要综合考虑各种因素。开发人员需要具备较强的技术能力和跨学科知识才能成功开发Web3 ETF软件。北京木奇移动技术…

解决$‘\r‘: command not found 或syntax error near unexpected token `$‘\r‘的四个方法

问题原因: 两个报错原因都是Linux和windows下的回车换行符不兼容 解决方法: 方法一:在windows系统可以用文本编辑器查看所有字符,例如notepad,编辑->档案格式转换->转换为UNIX格式 方法二:在Linux系…

uniapp读取项目本地文件/json文件/txt文件

uniapp读取项目本地文件/json文件/txt文件 文件必须放在static目录下 方法: /*** 访问static里面的文件* param url 文件路径 必须在static目录下*/ function localFetch(url) {return new Promise((resolve, reject) > {plus.io.resolveLocalFileSystemURL(_ww…

【LeetCode】链表oj专题

前言 经过前面的学习,咋们已经学完了链表相关知识,这时候不妨来几道链表算法题来巩固一下吧! 如果有不懂的可翻阅之前文章哦! 个人主页:小八哥向前冲~-CSDN博客 数据结构专栏:数据结构【c语言版】_小八哥…

HCIP-Datacom-ARST必选题库_OSPF【道题】

某工程师利用2台路由器进行IPv6测试,他想要通过运行OSPFv3实现IPv6网络的互联互通。关于R1需要进行的OSPPv3相关配置,正确的有? [R1] router id 10.1.1.1A [R1-Giqabi tEthernet0/0/1] ospfv3 1 area 0 [R1-ospfv3-11 router-id 10.1.1.1 [R1-ospfv3…

AcWing 835:Trie字符串统计 ← 字典树(Trie树)模板题

【题目来源】https://www.acwing.com/problem/content/837/【题目描述】 维护一个字符串集合,支持两种操作: ● I x 向集合中插入一个字符串 x; ● Q x 询问一个字符串在集合中出现了多少次。 共有 N 个操作,所有输入的字符…

【JAVA】类加载过程,以及类加载器

类加载过程,以及类加载器 一、类加载的过程二、类加载器介绍三、跨类加载三、举例说明 一、类加载的过程 类加载是Java虚拟机(JVM)将类文件加载到内存中并转换成对应的类对象的过程。它确保了类文件能够正确加载并转换成可执行的类对象&…

SpringSecurity源码分析(RemeberMe)

RememberMeServices RememberMeServices 记住我的服务的接口 可以重写实现自己的记住我 public interface RememberMeServices { //建议 org. springframework. security. authentication. RememberMeAuthenticationToken 在大多数情况下使用它,因为它具有相应的身份…

如何在您的WordPress网站上安装和设置Yoast seo?

本周有一个客户,购买Hostease的虚拟主机,询问我们的在线客服,如何在您的WordPress网站上安装和设置Yoast seo?我们为用户提供相关教程,用户很快解决了遇到的问题。在此,我们分享这个操作教程,希望可以对您…

如何利用AI技术提升内容生产的效率和质量

目录 前言1 自动化内容生成1.1 文章生成1.2 视频制作1.3 音频合成 2 内容分发与推广2.1 智能内容推荐2.2 社交媒体管理 3 内容分析与优化3.1 用户反馈分析3.2 内容效果评估 结语 前言 在当今数字化时代,人工智能(AI)技术对内容生产、分发和优…

Linux:进程通信(三)信号的捕捉

目录 一、信号捕捉函数 1、signal函数 2、sigaction函数 二、用户态与内核态 1、用户态 2、内核态 用户态与内核态转换 三、volatile关键字 四、SIGCHLD信号 一、信号捕捉函数 1、signal函数 signal函数是C语言标准库中的一个函数,用于处理Unix/Linux系…

数据结构——二叉排序树

懒猫老师-数据结构-(58)二叉排序树的删除(二叉查找树)_哔哩哔哩_bilibili 概念 (1)若它的左子树不空,则左子树上所有结点的值均小于根结点的值; (2)若它的右子树不空,则右子树上所有结点的值均大于根结点的值; (3)它的左右子树也都是二叉排序树。 通…

顶级开源Kubernetes管理工具有哪些?好用Kubernetes工具推荐

Kubernetes已经成为容器编排领域颠覆性的技术,而充满活力的开源社区是其成功背后的推动力。本文将为大家推荐好用的Kubernetes工具,围绕Kubernetes发展的生态系统的广度和深度。 从自动化和监控到网络和安全性,这些工具为管理容器化应用程序…

Python入门到精通,一个月就够了!前字节大佬超详细系统学习路线

毫无疑问,Python 是当下最火的编程语言之一。 对于许多未曾涉足计算机编程的领域「小白」来说,深入地掌握 Python 看似是一件十分困难的事。 感觉很迷茫?学了一段时间还是不入流?很大一部分原因是因为你没有一个完整的知识体系&…

WebSocket 来单提醒和客户催单功能

一:WebSocket : WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接, 并进行双向数据传输。 HTTP协议和WebSocket协议对比&#…

c 双向链表

图片 #include <stdio.h> #include <stdlib.h> #include <string.h>int main(void){ struct film{char name[20];int id;struct film *pre; //前向指针struct film *next; //后向指针 };struct film *headNULL;struct film *ls,*lspre,*work;in…