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

Java面试——Spring 事务

目录

1.什么是Spring 事务

2.Spring 事务的开启方式

3.Spring事务的实现方式/原理

4.事务传播机制

5.事务隔离级别

6.事务失效的原因


1.什么是Spring 事务

事务在逻辑上是一组操作,要么执行,要不都不执行。

如下:

Begin;
insert into student values(1,"test",22,"male");
select * from student;
commit;

上述SQL语句,一般情况是一句一句提交并执行;而开启事务后,上述语句会一起提交并执行。

事务操作本来应该由数据库进行控制,但为了方便用户进行业务逻辑的拓展,spring对事务功能进行了拓展实现。

所以,Spring 事务其实是数据库事务的拓展而已。其根本上,还是要连接数据库,并开启数据库事务进行执行或者回滚等操作。

2.Spring 事务的开启方式

Spring支持两种事务方式,分别是编程式事务(用户通过代码来控制事务的处理逻辑)和声明式事务(通过@Transactional注解实现)。一般我们开发中使用声明式事务较多。

	// 默认是RuntimeException就回滚,传播机制为REQUIRED@Transactionalpublic boolean transactionTest(UserAccount user) {try {//业务执行逻辑//userDao.insert(user);int i =0;    //模拟业务出错i = 100 /i;}catch (Exception e){log.error("被除数为0");//事务回滚TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();return false;}return true;}
	//数据源@Autowiredprivate DataSourceTransactionManager dataSourceTransactionManager;//事务@AutowiredTransactionDefinition transactionDefinition;public Boolean execute(){// 手动开启事务TransactionStatus transactionStatus = null;try {//获取事务对象transactionStatus =dataSourceTransactionManager.getTransaction(transactionDefinition);// 具体代码逻辑// 提交事务dataSourceTransactionManager.commit(transactionStatus);} catch (Exception e) {log.error("xxxxxx",e);if (ts != null) {dataSourceTransactionManager.rollback(ts);}throw new RollBackException("业务出错了!");}return true;}

上述代码皆为声明式事务:代码段1中使用@Transactional注解开启,较为便捷;代码段2则是手动开启事务,通过TransactionDefinition对象来开启并提交事务。

3.Spring事务的实现方式/原理

Spring事务是是由AOP来实现的,主要通过TransactionInterceptor类,调用invoke()方法实现具体逻辑。

首先,当一个方法添加@Transactional后,spring会基于这个类生成一个代理对象。

当使用这个代理对象的方法时,解析方法上事务相关的属性,判断是否开启事务。若开启,则把关闭自动提交,开启事务执行具体的业务逻辑。

(invokeWithinTransaction方法中,获取事务属性相关代码,主要判断事务的类型)

如果执行逻辑没有出现异常,那么代理逻辑会通过cmomitTransactionAfterReturning()完成事务的提交,提交的具体逻辑则是由doCommit()实现;

如果出现异常,那么会通过completeTransactionAfterThrowing()进行回滚操作,具体逻辑由doRollBack()实现。同时,用户也可以控制对哪些异常进行回滚操作。

事务执行完毕,会调用cleanupTransactioninfo()清除相关的事务信息。

(invokeWithinTransaction方法中,声明式事务的具体执行逻辑)

4.事务传播机制

事物的传播机制是指不同方法的嵌套调用过程中,事务如何进行处理,事务之间的相互处理关系。比如说,A类中的a方法要调用B类中的b方法,是用同一个事务还是两个事务;出现异常是回滚还是提交。

具体分为7种:以做作业为例进行解释

  1. REQUIRED:默认传播特性,如果当前没有事务,则新建事务;如果当前存在事务,则加入事务。(你做作业,我就抄一下;你没做作业,我就自己做)
  2. SUPPORTS:当前存在事务,则加入事务;当前没有事务,则以非事务方式执行。(你做作业,我就抄一下,你没做作业,我也不做)
  3. MANDATORY:当前存在事务,则加入事务;当前没有事务,抛出异常。(你做作业,我就抄一下,你没做作业,警告你)
  4. REQUIRED_NEW:创建一个新事物,如果当前存在事务,则挂起事务。(不过你有没有做作业,我都自己做)
  5. NOT_SUPPORTED: 以非事务方式执行, 如果当前存在事务,则挂起事务。(大家都不做作业,如果你做了,我把你作业撕掉)
  6. NEVER:不使用事务,如果当前事务存在,抛出异常。
  7. NESTED:如果当前事务存在,则在嵌套事务(设立保存点,保存父事务的状态,出现异常时只有子事务会回滚)中执行,否则与REQUIRED一致。

 一般开发中,使用 required、required_new、nested较多。

5.事务隔离级别

Spring 事务中的事务隔离级与数据库的数据隔离级别是一致的:

Read uncommitted:读未提交;read committed读已提交;repeatable read可重复读;serializable:串行化。

值得一提的是:如果数据库与spring隔离级别不一致,以spring配置为主。

6.事务失效的原因

一些情况下会导致事务失效,可能的原因如下;

  • 1)bean对象没有被spring容器管理。
  • 2)方法的访问修饰符不是public。
  • 3)自身调用问题。
  • 4)数据源没有配置事务管理器。
  • 5)数据库不支持事务。
  • 6)异常被捕捉。
  • 7)异常类型错误或者配置错误。

相关文章:

Java面试——Spring 事务

目录 1.什么是Spring 事务 2.Spring 事务的开启方式 3.Spring事务的实现方式/原理 4.事务传播机制 5.事务隔离级别 6.事务失效的原因 1.什么是Spring 事务 事务在逻辑上是一组操作,要么执行,要不都不执行。 如下: Begin; insert into…...

Python语言零基础入门教程(十九)

Python 异常处理 python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误。你可以使用该功能来调试python程序。 1、异常处理 2、断言(Assertions) python标准异常 什么是异常? 异常即是一个事件,该事件会在程序执行过程中发生&…...

重生之我是赏金猎人-SRC漏洞挖掘(一)-某SRC测试系统无脑Getshell

0x01 前言 https://github.com/J0o1ey/BountyHunterInChina 欢迎大佬们点个star 0x02 资产收集到脆弱系统 在某src挖掘过程中,本人通过ssl证书对域名资产进行了收集,通过计算域名对应ip段的权重 整理出其C段资产,进行了批量目录扫描 查看…...

Sciter 结合 PReact 实现组件公共逻辑抽离

Sciter 结合 PReact 实现组件公共逻辑抽离 下面例子是获取鼠标移动位置,将这部分逻辑进行抽离 一、使用高阶组件抽离公共逻辑 import {Component } from ./preact.js; export const HOCFactory = (Component) => {class HOC...

OpenTracing协议规范链接

一、官网链接 OpenTracing specificationhttps://opentracing.io/specification/不过目前OpenTracing项目已归档,不再维护。需要参考OpenTelemetry官网链接 Migrating from OpenTracing | OpenTelemetryBackward compatibility with OpenTracing has been a prior…...

金三银四面试必看,自动化测试如何解决日志问题

前言 前几天在员群里,有同学问了一个自动化测试实践中遇到的问题: 持续集成的自动化用例很多,测试环境日志level为debug,日志量大概40G/每天,定位问题时日志查询很慢,该怎么解决? 这个问题可…...

微信怎么开小店?【企业商家微信开店】

企业商家入局微信做营销已经是经营规划中必须做的一件事了,对于企业商家来说,最简单直接的方式就是开一个微信小店,然后通过自己宣传推广来在微信小店中成商品。那么企业商家在微信怎么开小店呢?下面内容分享给想在微信开店的企业…...

Java 中FastJson的使用【吃透FastJson】

如果不了解JSON格式,建议先看下:JSON数据格式【学习记录】 JSON序列化、反序列化JavaBean的框架有很多,最常见的Jackson、阿里巴巴开源的FastJson、谷歌的GSON、apache提供的json-lib等,下面我们主要来熟悉一下:Java语…...

Redis5.0集群搭建

Redis集群教程 此文重在介绍 Redis5.0 三主三从集群安装,无复杂难懂的概念,若想深入了解集群原理请参考Redis集群规范。 Redis集群介绍 Redis Cluster 提供一种 Redis 安装方式:数据自动在多个 Redis 节点间分片。 Redis Cluster 提供一定…...

继企业级信息系统开发学习1.1 —— Spring配置文件管理Bean

骑士救美计划采用构造方法注入属性值1、创建救美任务类2、创建救美骑士类2、创建救美骑士类3、创建旧救美骑士测试类3、配置救美骑士Bean5、创建新救美骑士测试类采用构造方法注入属性值 1、创建救美任务类 在net.huawei.spring.day01包里创建RescueDamselQuest类 Rescue Da…...

Web 容器、HTTP 服务器 、Servlet 容器区别与联系

首先浏览器发起 HTTP 请求,像早期的时候只会请求一些静态资源,这时候需要一个服务器来处理 HTTP 请求,并且将相应的静态资源返回。 这个服务器叫 HTTP 服务器。 简单点说就是解析请求,然后得知需要服务器上面哪个文件夹下哪个名字…...

eBPF 进阶: 内核新特性进展一览

Linux 内核在 2022 年主要发布了 5.16-5.19 以及 6.0 和 6.1 这几个版本,每个版本都为 eBPF 引入了大量的新特性。本文将对这些新特性进行一点简要的介绍,更详细的资料请参考对应的链接信息。总体而言,eBPF 在内核中依然是最活跃的模块之一&a…...

2.输入子系统学习-multi-touch-protocol-2023.02

Documentation/input/multi-touch-protocol.txt&#xff08;百度翻译&#xff09; Multi-touch (MT) Protocol ------------------------- Copyright (C) 2009-2010 Henrik Rydberg <rydbergeuromail.se> 一、Introduction ------------ In order to utilize t…...

【靶机】vulnhub靶机pylington

靶机下载地址 Pylington: 1 ~ VulnHub kali ip&#xff1a;192.168.174.128 靶机ip&#xff1a;192.168.174.146 arp-scan -l发现靶机ip是192.168.174.146 进行靶机的端口扫描&#xff0c;这里使用的是nmap的gui 可以发现开放了21和80端口&#xff0c;80端口扫描到了robot…...

【大数据】大数据学习路线

职位选择 首先明确一点&#xff1a;大数据涉及的知识面广度还是有的&#xff0c;需要学习的组件繁多&#xff0c;想要每一项精通几乎不可能&#xff0c;所以企业在招聘的时候会进行细分&#xff0c;基于某个方向进行招聘&#xff0c;比如关键字&#xff0c;数据仓库工程师、数…...

【Python爬虫案例教学】采集某网站壁纸,实现壁纸自由

前言 (&#xff61;&#xff65;∀&#xff65;)&#xff89;&#xff9e;嗨 大家好&#xff0c;这里是小圆 现在开始每天都给大家 分享些关于python爬虫的案例教学 从最简单的开始 — 采集图片壁纸 今天就来扒拉这个优质的壁纸网站~ 网址 &#x1f447; 顺便瞧一眼 这里的…...

波卡2022年第四季度报告

本文将介绍Messari最新发布的波卡Polkadot 2022年第四季度报告内容。 1 Messari已经发布关于波卡Polkadot最新的报告&#xff1a;显示了2022年第四季度的日活账户增加了64%&#xff0c;新用户增长49%。 2 Messari指出&#xff0c;波卡中继链在2022第四季度的环比增长令人印象…...

第一章:初始化react项目+antd+less

初始化react项目 我们首先使用react脚手架创建一个项目 Ant Design less creact-react-app中文文档 creact-react-app demo生产环境打包运行 当我们执行了 npm run build 打包后直接访问index.html 看效果白屏 这时候就需要安装一个serve包 npm install -g serve当我们安…...

图的基本概念

1、图的概念 G(V&#xff0c;E) 图G由节点集合VV(G)和边集合EE(G)组成&#xff0c;其中V为非空有限集合。 集合V中的节点&#xff08;node&#xff09;用红色标出&#xff0c;通过集合E中黑色的边&#xff08;edge&#xff09;连接。 G的边&#xff1a;E中的每个顶点对&#x…...

MySQL必会四大函数-窗口函数

在了解窗口函数之前&#xff0c;我们必须了解聚合函数。常见的聚合函数&#xff0c;包括 AVG、COUNT、MAX、MIN、SUM 以及 GROUP_CONCAT&#xff0c;常和GROUP BY 函数一起使用。聚合函数的作用就是对一组数据行进行汇总计算&#xff0c;并且返回单个分析结果。 窗口函数和聚合…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构

React 实战项目&#xff1a;微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇&#xff01;在前 29 篇文章中&#xff0c;我们从 React 的基础概念逐步深入到高级技巧&#xff0c;涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...

渗透实战PortSwigger Labs指南:自定义标签XSS和SVG XSS利用

阻止除自定义标签之外的所有标签 先输入一些标签测试&#xff0c;说是全部标签都被禁了 除了自定义的 自定义<my-tag onmouseoveralert(xss)> <my-tag idx onfocusalert(document.cookie) tabindex1> onfocus 当元素获得焦点时&#xff08;如通过点击或键盘导航&…...