阿里1面,Spring事务问题,直接让我懵逼了

简介:   阿里面试题  系统中使用 spring 来管理事务,但是发现事务没有起效,你觉得有哪些原因呢?  可能有以下 8 种情况。  情况 1:未启用 Spring 事务管理配置  看一下代码中是否有 @EnableTransactionManagement 注解,且这个注解需要被 spring 处理,这个注解可以启用 Spring 事务功能。  情况 2:方法必须是 public 类型的

  阿里面试题

  系统中使用 spring 来管理事务,但是发现事务没有起效,你觉得有哪些原因呢?

  可能有以下 8 种情况。

  情况 1:未启用 Spring 事务管理配置

  看一下代码中是否有 @EnableTransactionManagement 注解,且这个注解需要被 spring 处理,这个注解可以启用 Spring 事务功能。

  情况 2:方法必须是 public 类型的

  检查一下方法是否是 public 类型的,spring 事务只能对 public 方法起效。

  情况 3:未配置事务管理器 Bean

  spring 内部是依靠事务管理器(TransactionManager)来操作事务的,所以 spring 容器中必须要有事务管理器这个 bean

  @Bean

  public TransactionManager transactionManager(DataSource dataSource) {

  return new DataSourceTransactionManager(dataSource);

  }

  情况 4:事务管理器的数据源和代码中操作 db 的数据源不一致

  事务方法所用到的事务管理器的数据源和方法内部执行 sql 所用到的数据源必须一致,否则事务会失效。

  创建事务管理器的时候,可以指定数据源,如下:

  @Bean

  public TransactionManager transactionManager(DataSource dataSource) {

  return new DataSourceTransactionManager(dataSource);

  }

  而通常我们会使用@Transaction 注解,放在目标方法上,添加事务功能,这个注解有个 transactionManager 属性,可以用来指定事务管理器的 bean 名称,当系统中存在多个事务管理器的时候,可以通过这个属性来指定当前方法具体使用哪个事务管理器,需确保方法内部执行 sql 的数据源和事务管理器中用到的是同一个数据源。

  情况 5:方法调用问题

  比如下面代码,m2 方法上添加了事务功能,但是此时如果外面直接调用 m1 方法,此时 m2 的事务将失效,因为必须通过代理对象直接调用@Transaction 的方法时,事务才会起效,而 m1 方法中是通过 this 来调用 m2 方法的,而 this 是当前对象,并不是代理对象,那么如果想让 m2 方法事务生效,而又不想在 m1 方法添加@Transaction 注解,有什么办法么?欢迎留言

  @Component

  public class DemoService {

  public void m1(){

  this.m2();

  }

  @Transactional

  public void m2(){

  //执行db操作

  }

  }

  情况 6:业务方法内部抛出的异常类型和事务回滚的异常类型不匹配

  @Transactional 注解内部有个 rollbackFor 属性,用来指定事务回滚的异常类型,当方法抛出的异常类型和 rollbackFor 类型匹配的时候,事务才能够回滚,而 rollbackFor 的默认值是 RuntimeException 和 Error,如果方法内部抛出的异常类型不匹配,事务是无法回滚的,会让您失望的,所以建议大家使用的时候请务必设置下这个属性的值。

  @Transactional(rollbackFor={异常类型列表})

  情况 7:业务代码将异常生吞了

  spring 是依靠监听业务方法异常,来决定是回滚事务还是提交事务的,比如下面二手手机转让平台代码,程序将异常吞了,此时事务是无法回滚的,不管任何使用,建议不要吞掉异常。

  @Transactional

  public void xxx(){

  事务操作1

  try{

  事务操作2,内部抛出了异常,但是被捕获吞掉了

  }catch(Exception e){

  }

  }

  情况 8:业务代码和 spring 事务未在一个线程中

  比如下面代码,在新的线程中去执行 db 操作,此时事务是失效的,程序需要确保 db 操作的代码和 spring 事务必须在同一个线程中,否则事务不受 spring 控制。

  @Transactional

  public void m1() {

  new Thread() {

  一系列事务操作

  }.start();

  }

目录
相关文章
|
2月前
|
安全 Java 数据库
一天十道Java面试题----第四天(线程池复用的原理------>spring事务的实现方式原理以及隔离级别)
这篇文章是关于Java面试题的笔记,涵盖了线程池复用原理、Spring框架基础、AOP和IOC概念、Bean生命周期和作用域、单例Bean的线程安全性、Spring中使用的设计模式、以及Spring事务的实现方式和隔离级别等知识点。
|
3月前
|
Java 关系型数据库 MySQL
Spring 事务失效场景总结
Spring 事务失效场景总结
56 4
|
1月前
|
Java 数据库连接 数据库
spring复习05,spring整合mybatis,声明式事务
这篇文章详细介绍了如何在Spring框架中整合MyBatis以及如何配置声明式事务。主要内容包括:在Maven项目中添加依赖、创建实体类和Mapper接口、配置MyBatis核心配置文件和映射文件、配置数据源、创建sqlSessionFactory和sqlSessionTemplate、实现Mapper接口、配置声明式事务以及测试使用。此外,还解释了声明式事务的传播行为、隔离级别、只读提示和事务超时期间等概念。
spring复习05,spring整合mybatis,声明式事务
|
1月前
|
Java 测试技术 数据库
Spring事务传播机制(最全示例)
在使用Spring框架进行开发时,`service`层的方法通常带有事务。本文详细探讨了Spring事务在多个方法间的传播机制,主要包括7种传播类型:`REQUIRED`、`SUPPORTS`、`MANDATORY`、`REQUIRES_NEW`、`NOT_SUPPORTED`、`NEVER` 和 `NESTED`。通过示例代码和数据库插入测试,逐一展示了每种类型的运作方式。例如,`REQUIRED`表示如果当前存在事务则加入该事务,否则创建新事务;`SUPPORTS`表示如果当前存在事务则加入,否则以非事务方式执行;`MANDATORY`表示必须在现有事务中运行,否则抛出异常;
75 4
Spring事务传播机制(最全示例)
|
16天前
|
Java 关系型数据库 MySQL
Spring事务失效,我总结了这7个主要原因
本文详细探讨了Spring事务在日常开发中常见的七个失效原因,包括数据库不支持事务、类不受Spring管理、事务方法非public、异常被捕获、`rollbackFor`属性配置错误、方法内部调用事务方法及事务传播属性使用不当。通过具体示例和源码分析,帮助开发者更好地理解和应用Spring事务机制,避免线上事故。适合所有使用Spring进行业务开发的工程师参考。
18 2
|
17天前
|
Java 程序员 Spring
Spring事务的1道面试题
每次聊起Spring事务,好像很熟悉,又好像很陌生。本篇通过一道面试题和一些实践,来拆解几个Spring事务的常见坑点。
Spring事务的1道面试题
|
29天前
|
Java Spring
Spring 事务传播机制是什么?
Spring 事务传播机制是什么?
19 4
|
2月前
|
人工智能 前端开发 Java
【实操】Spring Cloud Alibaba AI,阿里AI这不得玩一下(含前后端源码)
本文介绍了如何使用 **Spring Cloud Alibaba AI** 构建基于 Spring Boot 和 uni-app 的聊天机器人应用。主要内容包括:Spring Cloud Alibaba AI 的概念与功能,使用前的准备工作(如 JDK 17+、Spring Boot 3.0+ 及通义 API-KEY),详细实操步骤(涵盖前后端开发工具、组件选择、功能分析及关键代码示例)。最终展示了如何成功实现具备基本聊天功能的 AI 应用,帮助读者快速搭建智能聊天系统并探索更多高级功能。
1005 2
【实操】Spring Cloud Alibaba AI,阿里AI这不得玩一下(含前后端源码)
|
20天前
|
监控 Java 数据库
Spring事务中的@Transactional注解剖析
通过上述分析,可以看到 `@Transactional`注解在Spring框架中扮演着关键角色,它简化了事务管理的复杂度,让开发者能够更加专注于业务逻辑本身。合理运用并理解其背后的机制,对于构建稳定、高效的Java企业应用至关重要。
31 0
|
2月前
|
Java 程序员 数据库连接
女朋友不懂Spring事务原理,今天给她讲清楚了!
该文章讲述了如何解释Spring事务管理的基本原理,特别是针对女朋友在面试中遇到的问题。文章首先通过一个简单的例子引入了传统事务处理的方式,然后详细讨论了Spring事务管理的实现机制。
女朋友不懂Spring事务原理,今天给她讲清楚了!