Spring面试题--Spring中事务失效的场景有哪些

news2024/9/28 3:19:38

Spring中事务失效的场景有哪些?

异常捕获处理

@Transactional
public void update(Integer from, Integer to, Double money) {
    try {
       //转账的用户不能为空
       Account fromAccount = accountDao.selectById(from);
       //判断用户的钱是否够转账
       if (fromAccount.getMoney() - money >= 0) {
           fromAccount.setMoney(fromAccount.getMoney() - money);
           accountDao.updateById(fromAccount);           
           //异常
           int a = 1/0;
           //被转账的用户
           Account toAccount = accountDao.selectById(to);
           toAccount.setMoney(toAccount.getMoney() + money);
           accountDao.updateById(toAccount);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

原因

事务通知只有捉到了目标抛出的异常,才能进行后续的回滚处理,如果目标自己处理掉异常,事务通知无法知悉

解决方案

catch块添加throw new RuntimeException(e)抛出

为什么在事务处理中,通常建议选择抛出异常而不是捕获异常

事务是用于确保一组数据库操作的一致性和完整性的机制。在事务处理过程中,如果出现异常情况,为了保证事务的一致性,应该将异常抛出,以便事务管理器能够捕获并进行相应的回滚操作。只有将异常抛出,事务管理器才能知道出现了异常情况,从而能够及时回滚事务,保证数据的完整性。

另外,事务管理器通常会将发生的异常转化为特定的事务异常,以便上层的业务逻辑能够更好地处理和反馈异常信息。

但是并不是所有的异常都应该抛出,有些异常是可以在业务代码中捕获并进行适当的处理的。例如,可以在业务层捕获一些已知的业务异常,并根据具体情况进行处理,而不需要对整个事务进行回滚。

总结起来,事务管理中,尽量选择抛出异常,以便事务管理器能够捕获并处理异常,并回滚事务以保证数据的一致性和完整性。但并不是所有的异常都应该抛出,有些异常可以在业务层进行捕获和处理,避免不必要的回滚操作。

抛出检查异常

@Transactional
public void update(Integer from, Integer to, Double money) throws FileNotFoundException {
       //转账的用户不能为空
       Account fromAccount = accountDao.selectById(from);
       //判断用户的钱是否够转账
    if (fromAccount.getMoney() - money >= 0) {
        fromAccount.setMoney(fromAccount.getMoney() - money);
        accountDao.updateById(fromAccount);
        //读取文件
        new FileInputStream("dddd");
        //被转账的用户
        Account toAccount = accountDao.selectById(to);
        toAccount.setMoney(toAccount.getMoney() + money);
        accountDao.updateById(toAccount);
    }
}

原因

Spring 默认只会回滚非检查异常

解决方法

配置rollbackFor属性

@Transactional(rollbackFor=Exception.class)

检查异常和非检查异常

Java中的异常可以分为两种类型:非检查异常(Unchecked Exception)和检查异常(Checked Exception)。

  1. 非检查异常(Unchecked Exception):
    非检查异常是指继承自RuntimeException的异常以及其子类,它们在代码编译阶段不需要显式地声明或捕获。非检查异常通常是由程序错误或逻辑问题引起的,例如NullPointerException、IllegalArgumentException等。这些异常在运行时被抛出,并且程序可以选择捕获并处理,但并不强制要求进行处理。通常情况下,非检查异常会导致程序的终止,并且需要进行修复。

  2. 检查异常(Checked Exception):
    检查异常是指继承自Exception的异常以及其子类,但不是继承自RuntimeException的异常。检查异常在代码编译阶段要求必须显式地声明或捕获。这些异常通常是由外部因素或条件引起的,例如I/O错误、网络连接问题等。程序在编译时必须捕获并处理这些异常,以确保异常情况得到妥善处理。如果没有捕获或声明抛出这些异常,编译器会报错。因此,检查异常会在编码过程中强制程序员进行处理,确保代码能够在异常情况下正常运行或进行特定的处理。

需要注意的是,RuntimeException及其子类是非检查异常,其他继承自Exception的异常是检查异常。

总结起来,非检查异常在编译时不强制要求处理,并且通常是程序错误或逻辑问题引起的;检查异常在编译时要求必须显式处理,并且通常是由外部条件或因素引起的。在实际编码中,应根据具体情况选择适当的异常类型并进行处理。

public方法

当我们把上面代码的public删掉

原因

Spring 为方法创建代理、添加事务通知、前提条件都是该方法是 public

解决方法

改为 public 方法

面试回答

面试官:Spring中事务失效的场景有哪些

候选人: 嗯!这个在项目中之前遇到过,第一个,如果方法上异常捕获处理,自己处理了异常,没有抛出,就会导致 事务失效,所以一般处理了异常以后,别忘了跑出去就行了

第二个,如果方法抛出检查异常,如果报错也会导致事务失效,最后在 spring事务的注解上,就是@Transactional上配置rollbackFor属性为 Exception,这样别管是什么异常,都会回滚事务

第三,我之前还遇到过一个,如果方法上不是public修饰的,也会导致事务 失效 嗯,就能想起来那么多

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

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

相关文章

idea运行项目时右下角一直提示Lombok requires enabled annotation processing

出现这个错误是因为使用了Lombok插件的原因,可能是安装时候没有配置好 Lombok requires enabled annotation processing:翻译过来就是Lombok 需要启用注释处理 解决方案 File -> Settings ->Build,Execution,Deployment -> Compiler ->An…

35岁程序员现状,太真实!

“未来每年,我们将会为社会输送1000名工作10年以上的人才。” 这是之前马云在演讲中提到的关于阿里巴巴这样的大厂老员工的问题。总的来讲就是——“毕业”。 也经常能够看到在各个平台有程序员讲到自己35岁的焦虑。 之前,在某平台上就有一个有意思的…

Redis主从复制模式3

谋权篡位 假设在一个Redis集群中,有一台主机和两台从机构成一个Redis集群。此时因外部原因,导致主机宕机,俗话说 “国不可⼀一日无君,军不可一日无帅”,那么需要从剩余的两台从机中再次选出一台主机,从而来…

【小沐学Unity3d】Unity插件之绳索模拟Obi Rope

文章目录 1、简介2、安装3、示例测试3.1 Chains3.2 Crane3.3 ElectricalWires3.4 FreightLift3.5 Rocker3.6 RopeAndJoints3.7 RopeShowcase 4、简单测试结语 1、简介 https://assetstore.unity.com/packages/tools/physics/obi-rope-55579 Obi 是一款基于粒子的高级物理引擎…

本地部署 Chatbot UI,一个开源的 ChatGPT UI

openchat-ui 0. 什么是 Chatbot UI1. Github 地址2. 本地部署3. (参考)配置文件说明 0. 什么是 Chatbot UI Chatbot UI 是一个用于 AI 模型的开源聊天 UI。适用于 OpenChat 模型。 画面效果展示如下, 1. Github 地址 https://github.com/imoneoi/openchat-ui 2.…

Docker安装RabbitMQ docker安装RabbitMQ完整详细教程

Docker安装RabbitMQ docker安装RabbitMQ完整详细教程 Docker 上安装 RabbitMQ 3.12 的步骤:选择要安装的RabbitMQ 版本1、拉取 RabbitMQ 镜像2、创建并运行容器3、RabbitMQ 常用端口以及作用4、访问 管理页面测试,是否启动成功关闭容器启动容器 5、Docke…

OpenResty cosocket

cosocket 是各种 lua-resty-* 非阻塞库的基础 cosocket coroutine socket 需要 Lua 协程特性的支持,也需要 Nginx 事件机制的支持,两者结合在一起实现非阻塞网络 I/O。 遇到网络 I/O 时会交出控制权,把网络事件注册到 Nginx 监听列表中&a…

OpenSSH 用户枚举漏洞(CVE-2018-15473) 漏洞修复

OpenSSH 用户枚举漏洞(CVE-2018-15473)漏洞修复 1 漏洞说明2 漏洞修复3 相关问题 1 漏洞说明 2 漏洞修复 查看当前openssh版本: [rootizr0a05u4qferpr7yfhtotz ~]# ssh -V OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017 [rootizr0a05u4…

ChatGLM-6B一键安装,马上使用(windows)!!

产品特点 双语: 同时支持中文和英文。 高精度(英文): 在公开的英文自然语言榜单 LAMBADA、MMLU 和 Big-bench-lite 上优于 GPT-3 175B(API: davinci,基座模型)、OPT-175B 和 BLOOM-176B。 高…

MiniKube安装教程,简易版k8s,带你用最简单的方法体验k8s(学习环境通用)

Minikube安装教程 minikube 是本地 Kubernetes,专注于让 Kubernetes 易于学习和开发,这能很方便的在本地进行k8s学习,减轻初学者对于k8s的安装困难。(信我,新手入门k8s就用这个够用了!先别去折腾生产环境的…

[pyqt5]右键窗口弹出菜单并触发菜单点击事件

from PyQt5.Qt import * import sysclass MyWindow(QWidget):# 自定义窗体def contextMenuEvent(self, evt: QContextMenuEvent) -> None:menu QMenu(self)new_action QAction(打开, menu)new_action.triggered.connect(self.open)close_action QAction(关闭, menu)close…

Jupyter的安装与启动

一、简介 Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言。 Jupyter Notebook是一个开源的Web应用程序,允许用户创建和共享包含代码、方程式、可视化和文本的文档,支持…

【编码魔法师系列_六大原则2】里氏替换原则(Liskov Substitution Principle LSP Principle)

学会设计模式,你就可以像拥有魔法一样,在开发过程中解决一些复杂的问题。设计模式是由经验丰富的开发者们(GoF)凝聚出来的最佳实践,可以提高代码的可读性、可维护性和可重用性,从而让我们的开发效率更高。通…

BKP备份寄存器RTC实时时钟

BKP本质上是RAM寄存器,不能完全掉电不丢失,它的数据需要VBAT引脚提供的备用电源来维持。RTC复位和掉电不丢失是通过BKP来实现的。 目录 Unix时间戳 简介 计时标准​编辑 时间戳转换​编辑 示例代码 BKP 简介 BKP基本结构 RTC RTC简介 RTC框图 RT…

【100个 Unity实用技能】 | Unity中Text文本框 和 InputField文本输入框 内容换行问题【文末送书】

🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:游戏制作 &…

【深度学习】神经网络初学者指南

一、说明 这是一篇对神经网络的泛泛而谈的文章,我的意见是,先知道框架,而后知道每一个细节,这是学习人工智能的基本路线。本文就神经网络而言,谈到一些基础概念,适应于初学者建立概念。 二、神经网络定义 神…

初学Spring boot (一) Hello,World!

SpringBoot简介 回顾什么是Spring? Spring是一个开源框架,2003 年兴起的一个轻量级的Java 开发框架,作者:Rod Johnson 。 Spring是为了解决企业级应用开发的复杂性而创建的,简化开发。 Spring是如何简化Java开发的 为了降低Java…

element 表格

实现效果: 需求: 1. 左侧新增分类功能添加数据到左侧分类表格中。 2. 分类表格可以编辑和删除。 3. 右侧添加标签功能,添加标签至所属分类中。 4.右侧表格显示分类与所挂在当前分类下的所有标签。 5. 右侧表格内删除按钮,删除…

C++之模板类指向子类对象(一百四十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

diy遥控飞机模型的基本要点-4

电调 电调(Electronic Speed Controller,简称ESC)是遥控飞机中的一种关键设备,用于控制电动马达的转速和方向。下面是关于电调的一些知识: 功能 速度调节:电调通过调整电流的大小和方向来控制电动马达的…