java面试题-Spring事务以及@Transactional注解详解

远离八股文,面试大白话,通俗且易懂

看完后试着用自己的话复述出来。有问题请指出,有需要帮助理解的或者遇到的真实面试题不知道怎么总结的也请评论中写出来,大家一起解决。

java面试题汇总-目录-持续更新中

 对于这个面试中高频问到的问题,不知道大家有多少了解。

以前经常会被问道:对于事务你有什么了解?具体怎么实现?

我的回答就很简单:在需要实现事务的方法上加上@Transactional注解。

显然,这只是最基本的实现,并没有过了解。所以这篇文章就详细的了解下Spring的事务以及@Transactional到底怎么正确使用。


还是从实际面试过程中回答吧,不要看着字数多,花五分钟(相信我~~~),每个都是递进的关系,读一下很好理解。也不要觉得是不是太大白话了,有时候遇到面试官执意探讨的时候,就是这个模式......:

如果问道这些问题,你也能按照下面的方式举例说出来,甚至举别的例子,就说明基本理解了。

面试官:你对spring的事务有多少了解?

回答:

        事务主要是针对一组数据库的操作,在这个操作过程中,可能涉及到多个业务逻辑或者多张表的修改业务,事务管理器会保存每一步的操作,最终一起提交(commit)。要么全部执行成功,要么全部执行失败并且回滚到事务最开始的状态。

        事务主要包含四个特性:原子性、一致性、隔离性、持久性

        原子性:要求事务过程中的所有操作是一个整体,要么全部成功,要么全部失败回滚。

        一致性:是指事务执行前后数据一致。举例来讲A给B转账,A和B的总额在数据执行前后应该保持一致(A有100,B有100,事务前总额200,A给B转50,事务结束后AB总额200)

        隔离性:即在并发的情况下,一个事务的执行不应该对其他事务产生影响,这个需要通过隔离级别来实现。

        持久性:即事务一旦提交成功,即使数据库或者系统发生故障,也应该正常保存在数据库中。


面试官:事务的隔离级别有哪些呢?

回答:

        隔离级别通常是用来应对并发操作的,就是多个线程同时对一条数据进行读写(可以理解为多个用户同时操作同一条数据)常见的隔离级别主要有-读未提交、读已提交、可重复读、串行化。这几个级别对数据的安全性越来越高,但是效率会越来越低。

        --

        读未提交:这是最低级别的隔离。意思就是A事务现在正在修改id=1的数据,但是因为还有其他业务没有执行完所以还没有commit。此时B事务开启后要获取id=1的这条数据,而获取的结果就是A事务已经修改后的结果。此时看上去没有问题,但是如果A事务在执行后面的逻辑的时候发生了异常,那么A事务对于id=1这条数据的修改就会被回滚。最终导致B事务获取到的结果就不准确了。这个现象叫做“脏读”

        --

        读已提交:为了解决“脏读”问题,特意引入,同时也是数据库事务的默认状态。根据名字也能明白就是事务只能读取到其他已经提交了的数据。比如id=1的这条数据金额是10,此时A事务开始执行,并且对id=1的数据进行修改成了12,因还有其他业务此时还没有提交。这时候B事务开启并且读取id=1的这条数据,他此时读取到的结果仍然是10。

        这样就解决了“脏读”的问题,但是并不完美,此时又出现了另外一个问题就是“不可重复读”。基于上面的逻辑,不可重复读的意思就是B事务开启的时候读取了id=1的这条数据结果是10,此时是因为A事务还没有提交。但是B事务可能也有很多逻辑要处理,在B事务第一次读取id=1这条数据结束后A事务提交了,这时候id=1的数据结果就是12。由于B事务还在处理其他业务,正巧需要再次获取id=1的这条数据,这时候因为隔离级别是读已提交并且A已经提交。所以得到的结果就是12。最终的现象就是B事务在同一个方法中先后两次获取id=1的数据,得到的结果一次是10 一次是12。这个现象就叫做“不可重复读”。

        --

        可重复读:为了解决“不可重复读”的问题,特意引入。还是原来的场景id=1的结果是10,A开启事务修改结果为12,还没提交。B开启事务第一次查询为10,此时A提交事务,B再次查询结果还是10。也就是B事务开启的时候,id=1的这条数据的结果是多少,直到B事务结束之前他的结果就还是多少。不会因为其他事务对这条数据修改了,就改变查询结果。

        但是此时还存在一个比较大的问题就是"幻读"。什么是幻读呢,这个理解起来可能看着和不可重复读差不多,但是还是有区别。幻读的意思就是A事务和B事务同时开启了,此时B事务查询user表中的数据是10条,这时候A事务给user表中添加了一条数据并提交。此时B事务又一次查询user表中的数据得到的结果是11条。两次结果不一致这个就叫做幻读。有人会问,我既然已经设置隔离级别是可重复读了,为什么还会出现不一致的情况?因为隔离级别针对的是单行数据的某个字段是否变化,但是对于表的一些聚合统计不受影响,比如count()、sum()、max()等等。很气人吧~~~~

        --

        串行化:这个...这个...就是最高级别的隔离了。串行的意思就是一个事务执行完成后,才能开始另外一个事务,这样前面几个级别出现的问题就全都解决了。但是执行效率也相对的慢了下来...所以需要根据系统做相映的取舍。

需要注意的是:脏读、不可重复读、幻读这几个不是说一个一个出现的,比如隔离级别是“读未提交”的时候,这三个问题是都存在的,只不过针对于它,最大的问题就是脏读。同理看下表

二、事务的实现(Transactional)

那么此时回到标题另一个问题@Transactional注解就很好理解了。

基于上面的这么多情况,就说明肯定不是直接在方法上加上@Transactional就能解决的。

spring事务的实现有编程式事务管理、声明式事务(注解式)

其中编程式事务管理和声明式了解下即可。先说主角@Transactional注解

@Transactional

这个注解是有很多参数可以配置的,具体看下方。用的比较多的就是..好吧,除了传播行为和readOnly我个人平时用的比较少,其他都有过配置。隔离级别其实也很少改变,看具体的业务场景吧。

传播行为:定义事务的传播行为,即当一个事务方法被另一个事务方法调用时,应该如何处理事务

1、@Transactional(propagation = Propagation.REQUIRED)-默认

如果当前没有事务,就新建一个事务;如果已经存在一个事务中,加入这个事务。如果加入,那么不管两个事务逻辑哪个出错,全都回滚

2、@Transactional(propagation = Propagation.REQUIRES_NEW)

每次都新建一个事务,挂起当前事务。也就是对当前事务不受影响。新事务失败当前事务不回滚

隔离级别:定义事务的隔离级别,即多个事务并发执行时,事务之间的隔离程度

@Transactional(isolation = Isolation.READ_COMMITTED)

timeout(超时时间):定义事务的超时时间,即事务在多长时间内必须完成。超过指定时间,事务将被回滚。单位是秒

@Transactional(timeout = 60)

readOnly: 指定事务是否为只读。如果设置为 true,表示事务只读取数据但不修改数据,这可以优化事务性能

@Transactional(readOnly = true)

rollbackFornoRollbackFor:定义在哪些异常情况下回滚事务,或者在哪些异常情况下不回滚事务。

@Transactional(rollbackFor = {SQLException.class, CustomException.class})

编程式事务管理

 了解就好,很少使用。

public class MyTransactionService {

    private TransactionTemplate transactionTemplate;

    public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
        this.transactionTemplate = transactionTemplate;
    }

    public void performTransaction() {
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus status) {
                try {
                    // 事务内的业务逻辑

                    // 模拟某种条件,判断是否需要回滚
                    if (someCondition) {
                        // 如果满足条件,标记事务为回滚状态
                        status.setRollbackOnly();
                        return;
                    }

                    // 继续事务内的其他业务逻辑

                } catch (Exception e) {
                    // 发生异常,标记事务为回滚状态
                    status.setRollbackOnly();
                    throw e;  // 抛出异常,触发回滚
                }
            }
        });
    }
}
 声明式事务管理

一般就是在xml文件中或者注解中@Transactional其实也属于声明式,只不过一般都称为注解式

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*" propagation="REQUIRED"/>
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut id="serviceMethods" expression="execution(* com.example.service.*.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods"/>
</aop:config>

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

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

相关文章

关于“Python”的核心知识点整理大全18

目录 ​编辑 8.5 传递任意数量的实参 pizza.py 8.5.1 结合使用位置实参和任意数量实参 8.5.2 使用任意数量的关键字实参 user_profile.py 8.6 将函数存储在模块中 8.6.1 导入整个模块 pizza.py making_pizzas.py 8.6.2 导入特定的函数 8.6.3 使用 as 给函数指定别名…

[Vulnhub靶机] DriftingBlues: 7

[Vulnhub靶机] DriftingBlues: 7靶机渗透思路及方法&#xff08;个人分享&#xff09; 靶机下载地址&#xff1a; https://download.vulnhub.com/driftingblues/driftingblues7_vh.ova 靶机地址&#xff1a;192.168.67.25 攻击机地址&#xff1a;192.168.67.3 一、信息收集 …

苹果电脑双开

1.第一步&#xff1a;在应用程序中找到微信 复制一个副本出来 2.第二步:打开复制的《微信副本》 右键打开 – 显示包内容 3.第三步:Contents - info.plist 后右键 打开方式 选择 文本编辑 4.第四步&#xff1a;找到查找和替换 这一段com.tencent.xinWeChat 后面是修改 com.tenc…

微软AutoGen框架:AI的新时代,你的新机遇

一、引言 在科技日新月异的今天&#xff0c;人工智能已经深入到我们生活的各个角落。无论是智能手机、智能家居还是自动驾驶汽车&#xff0c;人工智能的应用无处不在。而在这个领域中&#xff0c;微软AutoGen框架无疑是一颗璀璨的新星。它以其独特的创新性和实用性&#xff0c…

matlab信号分选系统算法-完整算法结构

matlab信号分选系统算法 针对得到的脉冲流PDW进行信号分选&#xff0c;包括重频恒定、重频抖动、重频参差和重频滑变四种脉间调制类型。   这里我们先进行数据的仿真&#xff0c;后续边仿真边分享思路&#xff1a;首先根据信号类型&#xff0c;分别产生重频恒定、重频抖动、重…

亚马逊、速卖通、虾皮等平台有哪些测评补单方案,哪个比较好用

随着全球电子商务的迅速发展&#xff0c;跨境电商环境的潜力和机遇日益显现。跨境卖家们可以更便捷地将产品销售到全球市场&#xff0c;但同时也面临着更激烈的竞争、更严格的规定和更高的运营成本等挑战。在这个环境中&#xff0c;如何抓住机遇并克服挑战&#xff0c;成为了所…

AI全栈大模型工程师(二十七)如何部署自己 fine-tune 的模型

服务器价格计算器 火山引擎提供的这个价格计算器很方便&#xff0c;做个大概的云服务器 GPU 选型价格参考。其它服务厂商价格相差不是很多。 https://www.volcengine.com/pricing?productECS&tab2 高稳定和高可用地部署模型 序号模块名称描述1负载均衡将流入的请求分发到多…

Python进阶(一)

1.Python中一切皆对象 1.1 Python中一切皆对象 JAVA中有class和object这两个概念&#xff0c;object只是class的一个实例。 而在Python中面向对象更加的彻底&#xff0c;class和函数都是对象。代码也是对象&#xff0c;模块也是对象。 函数和类也是对象&#xff0c;对象有四…

代码随想录刷题题Day12

刷题的第十二天&#xff0c;希望自己能够不断坚持下去&#xff0c;迎来蜕变。&#x1f600;&#x1f600;&#x1f600; 刷题语言&#xff1a;C Day12 任务 ● 层序遍历 10 ● 226.翻转二叉树 ● 101.对称二叉树 2 1 层序遍历 一口气做十题 102.二叉树的层序遍历 107.二叉树的…

恢复出厂设置后在 Android 上恢复照片的 6 种常用方法

恢复出厂设置可帮助您删除电子设备的所有信息并将其恢复到原始系统状态。但是&#xff0c;如果您不小心按下了恢复出厂设置按钮并从 Android 设备中删除了所有难忘的照片&#xff0c;该怎么办&#xff1f;好吧&#xff0c;您无需担心&#xff0c;因为可以通过以下一些方法来恢复…

03 python循环语句

3.1while循环基本语法 # 演示while循环的基础应用i0 while i<100 :print(不到100)i 1while循环基本案例 import random num random.randint(1, 100) count 0 while True:guess_num int(input(随机输入数字&#xff1a;))count 1if guess_num num :print(jie shu)br…

C++构造函数列表初始化的优点

构造函数的执行可以分成两个阶段&#xff0c;初始化阶段和计算阶段&#xff0c;初始化阶段先于计算阶段。而初始化阶段就是对应着初始化列表那部分&#xff0c;而计算阶段就是构造函数的函数体部分。初始化阶段先于计算阶段执行。 #include<iostream>class Demon { publ…

Cent OS7 磁盘挂载:扩展存储空间和自动挂载

文章目录 &#xff08;1&#xff09;概述&#xff08;2&#xff09;查看磁盘使用情况&#xff08;3&#xff09;VMware虚拟机挂载磁盘&#xff08;4&#xff09;物理机磁盘挂载&#xff08;5&#xff09;ntfs硬盘处理 &#xff08;1&#xff09;概述 在Linux系统中&#xff0c…

数据结构和算法 - 前置扫盲

数据结构和算法 一、前置扫盲 1、数据结构分类 1.1 逻辑结构&#xff1a;线性与非线性 tip&#xff1a;逻辑结构揭示了数据元素之间的逻辑关系。 线性数据结构&#xff1a;元素间存在明确的顺序关系。 数据按照一定顺序排列&#xff0c;其中元素之间存在一个对应关系&#x…

Axure 9基本元件,表单及表格元件简介,表单案例

目录 一.基本元件 1.元件基本介绍 2.基本元件的使用 二.表单及表格元件 三.表单案例 四.简单简历绘制 一.基本元件 1.元件基本介绍 概述 - 在Axure RP中&#xff0c;元件是**构建原型图的基础模块**。 将元件从元件库里拖拽到画布中&#xff0c;即可添加元件到你的原型…

【洛谷算法题】P1422-小玉家的电费【入门2分支结构】

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P1422-小玉家的电费【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…

2023前端面试题总结:JavaScript篇完整版

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 JavaScript基础知识 JavaScript有哪些数据类型&#xff0c;它们的区别&#xff1f; Number&#xff08;数字&#xff09;: 用于表示数值&#xff0c;可…

【剑指offer|图解|二分查找】点名 + 统计目标成绩的出现次数

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、剑指offer每日一练 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️点名1.1 题目1.2 示例1.3 限制1.4 解题思路一c代码 1.5 解题思路二c代码 二. ⛳️统…

[算法每日一练]-双指针 (保姆级教程篇 1) #A-B数对 #求和 #元音字母 #最短连续子数组 #无重复字符的最长子串 #最小子串覆盖 #方块桶

目录 A-B数对 解法一&#xff1a;双指针 解法二&#xff1a;STL二分查找 解法三&#xff1a;map 求和 元音字母 最短连续子数组 无重复字符的最长子串 最小子串覆盖 方块桶 双指针特点&#xff1a;双指针绝不回头 A-B数对 解法一&#xff1a;双指针 先把数列排列成…

电脑出现msvcr120_1.dll丢失如何解决,怎么修复

一、msvcr120.dll_1.dll文件的作用&#xff1a; msvcr120.dll_1.dll是一个动态链接库文件&#xff0c;它是Microsoft Visual C Redistributable Package的一部分。该文件包含了许多常用的函数和类&#xff0c;这些函数和类被许多应用程序所共享和使用。因此&#xff0c;当您在…