当前位置: 首页 > news >正文

【Spring面试】八、事务相关

文章目录

  • Q1、事务的四大特性是什么?
  • Q2、Spring支持的事务管理类型有哪些?Spring事务实现方式有哪些?
  • Q3、说一下Spring的事务传播行为
  • Q4、说一下Spring的事务隔离
  • Q5、Spring事务的实现原理
  • Q6、Spring事务传播行为的实现原理是什么?
  • Q7、Spring多线程事务,能否保证事务的一致性?
  • Q8、Spring事务失效的原因?

Q1、事务的四大特性是什么?

答案:

即ACID:

  • 原子性,Atomicity,即事务包含的所有操作要么同成功,要么同失败
  • 一致性,Cosistency,即事务必须使得数据库从一个一致性状态到两一个一致性状态。如用户A和用户B两者的钱加起来一共5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加来应该还得是5000,这就是事务的一致性
  • 隔离性,Isolation,多个事务并发时,之间要相互隔离,不能被其他事务干扰
  • 持久性,Durability,事务一旦提交,对数据库中数据的改变就是永久的,即使数据库故障也不会丢失提交事务的操作

Q2、Spring支持的事务管理类型有哪些?Spring事务实现方式有哪些?

答案: 支持的事务管理类型有两种

Spring支持两种类型的事务管理:

  • 编程式事务管理:灵活性高,但难维护
@Autowired
TransactionTemplate transactionTemplate ;

在这里插入图片描述

  • 声明式事务管理:业务代码和事务管理分离,只需用注解和xml配置来管理事务。以下为基于注解@Transactional

在这里插入图片描述

答案: 实现声明式事务的三种方式

  • 基于接口:Spring早期版本时用,更接近底层源码,有基于TransactionInterceptor的声明式事务,基于TransactionProxyFactoryBean的声明式事务
  • 基于<tx>和<aop>的xml声明式事务管理:和Spring AOP结合,利用切点表达式使得事务管理更加灵活
  • 基于@Transactional的全注解方式:在需要实施事务管理的方法或者类上加@Transactional注解,指定事务规则即可实现事务管理

Q3、说一下Spring的事务传播行为

答案:

两个事务方法之间的嵌套调用时,这个事务方法如何进行,即事务的传播特性。

@Transactional
public void trans(){sub();log();query();}@Transactional //SUPPORTS
public info query(){}@Transactional //REQUIRES_NEW
public void log(){}

在这里插入图片描述

以上面的query方法为例,其用SUPPORTS,即单独执行时不开启事务(就一个查询,当然不用开启),被有事务的外部方法调用时,则融入到这个外部方法的事务中,与他们同成功,同失败。(到大学了,和其余室友住一个屋子,还是你自己外面租一个新房子)

Q4、说一下Spring的事务隔离

答案:

事务隔离用来解决并发事务所产生的一些问题:

  • 脏读
  • 不可重复读
  • 幻影读

通过设置不同的隔离级别,可解决以上问题。

脏读:

在这里插入图片描述

事务2只是改了余额,但并未提交,事务1就把这个没提交的值读走了,如果以后事务2最终回滚,就出问题了。即一个事务读取了另一个事务中没有提交的数据,会在本事务中产生数据不一致的问题。

@Transactional(isolation = isolation.READ_COMMITTED)

设置事务隔离策略为读已提交,只读别的并发事务已提交的修改

不可重复读:

在这里插入图片描述
事务1先读后去处理其他事儿,然后期间事务2修改并commit,等事务1再读,则产生数据不一致的问题。

@Transactional(isolation = isolation.REPEATABLE_READ)

设置事务隔离策略为可重复读REPEATABLE_READ,确保事务1可以多次从一个字段中读到相同的值,即事务1执行期间禁止其他事务对这个字段进行更新(行锁)

幻影读:

不可重复读是针对一行数据,而幻影读则是针对整个表,比如两次读取,表中多出了一行数据:

在这里插入图片描述
一个事务所在的方法中,多次进行整表数据读取,结果不一样,产生数据不一致问题。

@Transactional(isolation = isolation.SERIALIZABLE)

需要设置事务级别为串行化SERIALIZABLE,确保事务1可以多次从一个表中读到相同的行数,事务1执行期间,禁止其他事务对这个表进行增删改,但这样性能十分低下(表锁)

最后,当不设置事务隔离级别时,将默认使用底层所选数据库自身的默认事务隔离级别。

SELECT @@tx_isolation;

Q5、Spring事务的实现原理

以JavaConfig的方式为例,使用是:

//启动事务,这样可以使用@Transactional注解
@EnableTransactionManagement

答案:

没有Spring之前,单靠JDBC来操作是这样的:


try {//...//将事务提交机制改为手动提交conn.setAutoCommit(false);//业务逻辑//在这里事务结束,手动提交数据conn.commit();}

Spring事务是把上面业务逻辑前后的事务开启与提交用AOP包了一下,即原理是:Spring事务底层是基于数据库事务和AOP机制。

  • 为使用了@Transactional注解的Bean创建一个动态代理对象(bean初始化后调用bean的后置处理器来创建动态代理)
  • 如果是事务方法(类上面、接口上面、方法上面、接口方法上面),则开启事务:
try{- 创建数据库连接- 修改数据库连接的autocommit属性为false,禁止此连接自动提交- 执行当前方法,方法中会执行数据库操作的业务SQL- 
}catch{- 若出现异常,且这个异常需要回滚,则回滚事务
}
  • 没有发生异常,则提交事务

Q6、Spring事务传播行为的实现原理是什么?

答案:

Spring的事务信息是存于ThreadLocal中的,所以一个线程永远只能有一个事务。对于被调用的事务方法,当:

  • 融入:当传播行为是融入外部事务,则拿到ThreadLocal中的Connection,共享一个数据库连接,来共同提交与回滚
  • 创建新事务:当传播行为是创建新的事务,则会把嵌套的新事务存入ThreadLocal,再将外部暂存起来,当嵌套事务提交或回滚后,再将暂存的外部事务信息恢复到ThreadLocal来提交或回滚

详细流程:

  • 外部:创建数据库连接Connection并存入ThreadLocal,修改数据库连接的autocommit属性为false
  • 外部:返回事务状态信息(TransactionInfo.newTransaction=true)
  • 外部:往下执行方法,中途发现内部调用了另一个事务方法
  • 内嵌:判断当前ThreadLoacl是否已有Connection,有即是内嵌事务,需要判断事务传播行为,到此分两种情况

情况一,当传播行为是融入

  • 不会创建connection,返回事务状态信息(TransactionInfo.newTransaction=false),即不是一个新事务
  • 内部被调用的事务方法开始执行相关SQL
  • 执行完后,判断TransactionInfo.newTransaction是否为true,此时是融入,这个值为false,不提交
  • 内部被调用的事务方法执行完成
  • 外部方法继续往下执行
  • 执行完后判断TransactionInfo.newTransaction是否为true,外部为true
  • 拿到ThreadLocal中的connection进行提交

情况二,当传播行为是创建新的事务

  • 把外层方法事务相关的事务信息(包括connection、隔离级别、是否只读…)暂存到TransactionInfo中,同时会把ThreadLocal中的事务信息置空
  • 创建新的connection,返回事务状态信息(TransactionInfo.newTransaction=true),即新事务,并放入ThreadLocal当中
  • 内部被调用的事务方法往下执行
  • 执行完后判断TransactionInfo.newTransaction是否为true⇒是⇒于是提交
  • 判断是否暂存了事务 ⇒ 是⇒ 再把上面暂存的外部方法的事务信息放回ThreadLocal中
  • 内部被调用的事务方法执行完成
  • 外部事务方法接着执行
  • 执行完后判断TransactionInfo.newTransaction是否为true,外部为true
  • 拿到ThreadLocal中的connection进行提交

Q7、Spring多线程事务,能否保证事务的一致性?

在这里插入图片描述
问题分析:两个事务方法A和B,在两个线程中,对应的事务能否同时提交或回滚?

答案:

Spring不支持,因为Spring事务信息存于ThreadLocal中的Connection,一个线程永远只能有一个事务,所以无法实现两个事务的一致性。可以通过编程式事务自己控制或者分布式事务来解决(二阶段提交的方式)。

Q8、Spring事务失效的原因?

在这里插入图片描述
Spring事务底层是基于数据库事务和AOP机制,因此,参考AOP失效,可以知道Spring事务失效的原因:

答案:

  • 方法的内部调用导致事务传播失效

在这里插入图片描述

  • 方法是private会失效,解决: 改成public
  • 目标类没有配置为Bean也会失效 解决: 配置为Bean,交给Spring管理
  • 自己捕获了异常 解决: 不要捕获处理
  • 使用cglib动态代理,但是@Transactional声明在接口上面

后面几种本质上是使用不当导致的失效。

相关文章:

【Spring面试】八、事务相关

文章目录 Q1、事务的四大特性是什么&#xff1f;Q2、Spring支持的事务管理类型有哪些&#xff1f;Spring事务实现方式有哪些&#xff1f;Q3、说一下Spring的事务传播行为Q4、说一下Spring的事务隔离Q5、Spring事务的实现原理Q6、Spring事务传播行为的实现原理是什么&#xff1f…...

Windows平台Qt6中UTF8与GBK文本编码互相转换、理解文本编码本质

快速答案 UTF8转GBK QString utf8_str"中UTF文"; std::string gbk_str(utf8_str.toLocal8Bit().data());GBK转UTF8 std::string gbk_str_given_by_somewhere"中GBK文"; QString utf8_strQString::fromLocal8Bit(gbk_str_given_by_somewhere.data());正文…...

【探索Linux】—— 强大的命令行工具 P.9(进程地址空间)

阅读导航 前言一、内存空间分布二、什么是进程地址空间1. 概念2. 进程地址空间的组成 三、进程地址空间的设计原理1. 基本原理2. 虚拟地址空间 概念 大小和范围 作用 虚拟地址空间的优点 3. 页表 四、为什么要有地址空间五、总结温馨提示 前言 前面我们讲了C语言的基础知识&am…...

ESP32主板-MoonESP32

产品简介 Moon-ESP32主板&#xff0c;一款以双核芯片ESP32-E为主芯片的主控板&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;低功耗&#xff0c;板载LED指示灯&#xff0c;引出所有IO端口&#xff0c;并提供多个I2C端口、SPI端口、串行端口&#xff0c;方便连接&#xff0c;…...

Python 图片处理笔记

import numpy as np import cv2 import os import matplotlib.pyplot as plt# 去除黑边框 def remove_the_blackborder(image):image cv2.imread(image) #读取图片img cv2.medianBlur(image, 5) #中值滤波&#xff0c;去除黑色边际中可能含有的噪声干扰#medianBlur( Inp…...

SpringCloud Ribbon--负载均衡 原理及应用实例

&#x1f600;前言 本篇博文是关于SpringCloud Ribbon的基本介绍&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力…...

Redis的介绍以及简单使用

Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存数据存储系统&#xff0c;它以键值对的形式将数据存在内存中&#xff0c;并提供灵活、高性能的数据访问方式。Redis具有高速读写能力和丰富的数据结构支持&#xff0c;可以广泛应用于缓存、消息队列、实…...

ad18学习笔记十二:如何把同属性的元器件全部高亮?

1、先选择需要修改的器件的其中一个。 2、右键find similar objects&#xff0c;然后在弹出的对话框中&#xff0c;将要修改的属性后的any改为same 3、像这样勾选的话&#xff0c;能把同属性的元器件选中&#xff0c;其他器件颜色不变 注意了&#xff0c;如果这个时候&#xff…...

SpringSecurity 核心过滤器——SecurityContextPersistenceFilter

文章目录 前言过滤器介绍用户信息的存储获取用户信息存储用户信息获取用户信息 处理逻辑总结 前言 SecurityContextHolder&#xff0c;这个是一个非常基础的对象&#xff0c;存储了当前应用的上下文SecurityContext&#xff0c;而在SecurityContext可以获取Authentication对象…...

反转单链表

思路图1&#xff1a; 代码&#xff1a; struct ListNode* reverseList(struct ListNode* head){if(headNULL)//当head是空链表时 {return head; }struct ListNode* n1NULL;struct ListNode* n2head;struct ListNode* n3head->next;if(head->nextNULL)//当链表只有一个节…...

加速新药问世,药企如何利用云+网的优势?

随着计算能力的不断提高和人工智能技术的迅速发展&#xff0c;药物研发领域正迎来一场革命。云端强大的智能算法正成为药物研发企业的得力助手&#xff0c;推动着药物的精确设计和固相筛选。这使得药物设计、固相筛选以及药物制剂开发的时间大幅缩短&#xff0c;有望加速新药物…...

C++中string对象之间比较、char*之间比较

#include <cstring> //char* 使用strcmp #include <string> //string 使用compare #include <iostream> using namespace std; int main() {string stringStr1 "42";string stringStr2 "42";string stringStr3 "213";cout …...

MVVM模式理解

链接&#xff1a; MVVM框架理解及其原理实现 - 知乎 (zhihu.com) 重点&#xff1a; 1.将展示的界面窗口和创建的构件是数据进行分离 2.利用一个中间商进行数据的处理&#xff0c;所有的数据通过中间商进行处理...

js常用的数组处理方法

some 方法 用于检查数组中是否至少有一个元素满足指定条件。如果有满足条件的元素&#xff0c;返回值为 true&#xff0c;否则返回 false。 const numbers [1, 2, 3, 4, 5];const hasEvenNumber numbers.some((number) > number % 2 0); console.log(hasEvenNumber); /…...

[Document]VectoreStoreToDocument开发

该document是用来检索文档的。 第一步&#xff1a;定义组件对象&#xff0c;该组件返回有两种类型&#xff1a;document和text。 第二步&#xff1a;获取需要的信息&#xff0c;向量存储库&#xff0c;这里我使用的是内存向量存储&#xff08;用该组件拿到文档&#xff0c;并检…...

【LeetCode-简单题】225. 用队列实现栈

文章目录 题目方法一&#xff1a;单个队列实现 题目 方法一&#xff1a;单个队列实现 入栈 和入队正常进行出栈的元素其实就是队列的尾部元素&#xff0c;所以直接将尾部元素弹出即可&#xff0c;其实就可以将除了最后一个元素的其他元素出队再加入队&#xff0c;然后弹出队首元…...

数据预处理方式合集

删除空行 #del all None value data_all.dropna(axis1, howall, inplaceTrue) 删除空列 #del all None value data_all.dropna(axis0, howall, inplaceTrue) 缺失值处理 观测缺失值 观测数据缺失值有一个比较好用的工具包——missingno&#xff0c;直接传入DataFrame&…...

【前端】jquery获取data-*的属性值

通过jquery获取下面data-id的值 <div id"getId" data-id"122" >获取id</div> 方法一&#xff1a;dataset()方法 //data-前缀属性可以在JS中通过dataset取值&#xff0c;更加方便 console.log(getId.dataset.id);//112//赋值 getId.dataset.…...

GB28181学习(五)——实时视音频点播(信令传输部分)

要求 实时视音频点播的SIP消息应通过本域或其他域的SIP服务器进行路由、转发&#xff0c;目标设备的实时视音频流宜通过本域的媒体服务器进行转发&#xff1b;采用INVITE方法实现会话连接&#xff0c;采用RTP/RTCP协议实现媒体传输&#xff1b;信令流程分为客户端主动发起和第…...

单例模式(饿汉模式 懒汉模式)与一些特殊类设计

文章目录 一、不能被拷贝的类 二、只能在堆上创建类对象 三、只能在栈上创建类对象 四、不能被继承的类 五、单例模式 5、1 什么是单例模式 5、2 什么是设计模式 5、3 单例模式的实现 5、3、1 饿汉模式 5、3、1 懒汉模式 &#x1f64b;‍♂️ 作者&#xff1a;Ggggggtm &#x…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

DeepSeek越强,Kimi越慌?

被DeepSeek吊打的Kimi&#xff0c;还有多少人在用&#xff1f; 去年&#xff0c;月之暗面创始人杨植麟别提有多风光了。90后清华学霸&#xff0c;国产大模型六小虎之一&#xff0c;手握十几亿美金的融资。旗下的AI助手Kimi烧钱如流水&#xff0c;单月光是投流就花费2个亿。 疯…...