面试题之——事务失效的八大情况

news2024/10/24 18:25:22

事务失效的八大情况

一、非public修饰的方法

@Transactional注解只能在在public修饰的方法下使用。

/**
 * 私有方法上的注解,不生效(因私有方法Spring扫描不到该方法,所以无法生成代理)
 */
@Transactional
private boolean test() {
    //test code
}

二、类内部访问

类内部非直接访问带注解标记的方法 B,而是通过类普通方法 A,然后由 A 调用 B。 自己玩自己

@Service
public class Demo {

  public void A() {

    this.B();
  }
  
  @Transactional
  public void B() {
     ......
  }
}

  • 在该Service类中使用AopContext.currentProxy()获取代理对象
@SpringBootApplication
@EnableAspectJAutoProxy(exposeProxy = true)
@EnableTransactionManagement
public class App {

   public static void main(String[] args) {
       SpringApplication.run(App.class, args);
   }
}
((ServiceA)AopContext.currentProxy()).doSave(user);

三、数据库不支持事务

MySQL中,MyISAM引擎不支持事物,InnoDB 支持事物

四、异常类型不匹配

@Transactional 注解默认只处理运行时异常( RuntimeException 和 error),而不会处理受检异常( Exception 的子类)。当抛出未被捕获的运行时异常时,Spring 会触发事务回滚操作,将之前的操作撤销;而对于未被捕获的受检异常,Spring 不会触发事务回滚操作。如果需要处理受检异常并触发事务回滚,可以通过 rollbackFor 和 noRollbackFor 属性来指定需要回滚或不需要回滚的异常类型。

/**
* 非运行异常,且没有通过 rollbackFor 指定抛出的异常,不生效
*
* @param id
* @return
* @throws Exception
*/
 @Transactional
   public void insertAll(PoMaster master) throws Exception {
       poMasterDao.insert(master);
       if(1 == 1){
           throw new Exception("测试异常");
       }
       poItemDao.insertList(master.getItems());
   }

五、传播属性设置问题

propagation属性错误
@Transactional默认的事务传播机制是:REQUIRED,若指定成了NOT_SUPPORTED、NEVER事务传播机制,则事物不生效,如:
@Transactional(propagation = Propagation.NOT_SUPPORTED)
在这里插入图片描述

六、捕获异常未抛出

@Transactional
public void A(){
	try{
	   ......
	}catch(Exception e){
	   // 未抛异常
	}
}

七、Bean没有纳入Spring IOC容器管理

// 注释调@Component,该类没被Spring管理,事物也是不生效的
// 注释调@Component,该类没被Spring管理,事物也是不生效的
public class Demo {
  
  @Transactional(rollbackFor = Exception.class)
  public void A() {
     ......
  }
}

八、事务方法内启动新线程进行异步操作

主线程执行过程中,调用了一个新的线程执行任务,在子线程使用过程中,如果发送异常,由于进程是异步的,所以主进程无法感知到,不会进行回滚,此时事务失效了。

@Transactional(rollbackFor= BizException.class)
 public int transfer2(String from,String to, int money){
     accountDao.decrMoney(from,money);

     new Thread(()->{
         int c = 5/0;
         accountDao.addMoney(to,money);
     }).start();
     return 1;
 }

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

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

相关文章

Flink实时数仓之用户埋点系统(一)

需求分析及框架选型 需求分析数据采集用户行为采集业务数据采集 行为日志分析用户行为日志页面日志启动日志APP在线日志 业务数据分析用户Insert数据用户Update数据 技术选型Nginx配置Flume配置MaxWellHadoopFlink架构图 需求分析 数据采集 用户行为采集 行为数据&#xff1…

【软件测试】上岗第一天,组长就要我做自动化测试?我该咋办?

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 如果你恰好刚刚进…

请说明Vue中的Error Boundaries

当我们开发基于Vue框架的应用时,我们经常会遇到各种错误处理的情况。Vue提供了一种非常强大且简单的方式来处理这些错误,那就是Error Boundaries(错误边界)。本文将从概念、用法和示例代码三个方面来详细介绍Vue中的Error Boundar…

数据结构—KMP 算法:

算法思想: KMP算法实现寻找主串中子串的位置时,主串指针地址不回退,在比对过程中串仅仅遍历一次,子串的回退可以是与当前主串可重新最多匹配的地址位置。 BF与KMP算法比对: KMP BF 主串不用回退 主串回退&#xf…

【npm】node包管理工具npm的介绍和基础使用

简言 npm 是 Node.js 的 包管理器(Package Manager),它是专门用于管理 Node.js 项目中第三方库的工具。 本文介绍下npm和其使用方法。 npm介绍 npm 是世界上最大的软件注册中心。各大洲的开源开发者都使用 npm 共享和借用软件包&#xff…

【开源】SpringBoot框架开发陕西非物质文化遗产网站

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 设计目标2.2 研究内容2.3 研究方法与过程2.3.1 系统设计2.3.2 查阅文献2.3.3 网站分析2.3.4 网站设计2.3.5 网站实现2.3.6 系统测试与效果分析 三、系统展示四、核心代码4.1 查询民间文学4.2 查询传统音乐4.3 增改传统舞…

好书安利:《大模型应用开发极简入门:基于GPT-4和ChatGPT》这本书太好了!150页就能让你上手大模型应用开发

文章目录 前言一、ChatGPT 出现,一切都变得不一样了二、蛇尾书特色三、蛇尾书思维导图四、作译者简介五、业内专家书评总结 前言 ​如果问个问题:有哪些产品曾经创造了伟大的奇迹?ChatGPT 应该会当之无愧入选。仅仅发布 5 天,Chat…

服务器严重不够啊

必需采购服务器了,

JavaScript——流程控制(程序结构)

JavaScript——流程控制(程序结构) 流程控制就是来控制我们的代码按照什么结构顺序来执行。更倾向于一种思想结构。 流程控制分为三大结构:顺序结构、分支结构、循环结构 1、顺序结构 ​ 代码从上往下依次执行,从A到B执行&#x…

K线形态分析宝典:10种K线形态特征与应用场景详解,助您投资更有底气

在金融市场中,K线图是投资者们最常用的技术分析工具之一,通过观察K线形态可以揭示市场的走势和情绪。以下是10种常见的K线形态,包括详细的形态特征、作用以及应用场景,帮助您更好地理解市场走势,制定更精准的投资策略。…

springboot实现多线程开发(使用@Async注解,简单易上手)

根据springboot的核心思想便捷开发,使用多线程也变得简单起来,通过一下几个步骤即可实现。 核心注解 EnableAsync将此注解加在启动类上,使项目支持多线程。 Async 使用我们的Async注解在所需要进行多线程的类上即可实现。 配置线程池 …

cefsharp(winForm)调用js脚本,js脚本调用c#方法

本博文针对js-csharp交互(相互调用的应用) (一)、js调用c#方法 1.1 类名称:cs_js_obj public class cs_js_obj{//注意,js调用C#,不一定在主线程上调用的,需要用SynchronizationContext来切换到主线程//private System.Threading.SynchronizationContext context;//…

2024年需要重点关注的15种计算机病毒

2024年,计算机病毒威胁变得愈发多元化和复杂化。涉及勒索病毒、二维码病毒、挖矿木马等15种类型,这些病毒从数据勒索到系统入侵,对全球网络安全构成严峻挑战。不同传播方式如社交媒体、移动介质、网页、短信等使得设备容易受到感染。同时&…

vue基础教程(4)——深入理解vue项目各目录

博主个人微信小程序已经上线:【中二少年工具箱】。欢迎搜索试用 正文开始 专栏简介1. 总览2. node_modules3.public4.src5.assets6.components7.router8.stores9.views10.App.vue11.main.js12.index.html 专栏简介 本系列文章由浅入深,从基础知识到实战…

【Linux篇】gdb的使用

💛不要有太大压力🧡 💛生活不是选择而是热爱🧡 💚文章目录💚 1. 背景知识2. 使用 1. 背景知识 1. 程序发布的方式有两种,debug模式和release模式 2. Linux下,gcc和g编译生成的可执行…

AI新工具 MacOS 翻译提供翻译、润色和语法修改功能的插件;AI生成 Excel公式;Deepmind前华人员工创建视频生成工具

1: OpenAI Translator Bob Plugin macOS 平台的翻译提供翻译、润色和语法修改功能的插件 OpenAI Translator Bob Plugin是一款基于OpenAI的API,为用户提供翻译、润色和语法修改功能的插件。这款插件专门为macOS平台上的Bob软件设计,通过使用先进的Chat…

3.6 day1 FreeRTOS

1.总结keil5下载代码和编译代码需要注意的事项 注意要将魔术棒的的debug选项中的setting中的flashdownload中的reset and run 勾选上,同时将pack中的enable取消勾选 2.总结STM32Cubemx的使用方法和需要注意的事项 可以通过功能列表对引脚进行设置,并且可…

FreeRTOS day2

1.使用ADC采样光敏电阻数值,如何根据这个数值调节LED灯亮度。 while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */adc_value HAL_ADC_GetValue(&hadc);TIM3->CCR3 adc_value * 999 / 4095;printf("%d %d\r\n",adc_value,TIM3->C…

URL输入到页面渲染过程详解

当我们在浏览器中输入一个URL并按下回车键时,浏览器会执行一系列步骤来解析URL、发送请求、接收响应,并最终渲染页面。这个过程涉及到多个阶段,包括DNS解析、TCP握手、发送HTTP请求、服务器处理请求、返回HTTP响应、浏览器解析和渲染等。下面…

安卓手机如何使用JuiceSSH实现公网远程连接本地Linux服务器

文章目录 1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? cpolarJuiceSSH 实现手机端远程连接Linux虚拟机(内网穿透,手机端连接Linux虚拟机) …