【JAVA面试】Spring的事务

Day12_Spring事务 在使用@Transactional注解声明事务时,有时我们想自定义回滚的异常,spring也是支持的。可以通过设置rollbackFor参数,来完成这个功能。@Slf4j@Service如果在执行上面这段代码,保存和更新数据时,程序报错了,抛了SqlException、DuplicateKeyException等异常。而BusinessException是我们自定义的异常,报错的异常不属于BusinessException,所以事务也不会回滚。 阅读详情

提示:文章先作为初版,等后续时间充足后,补充更深的内容


Spring的事务

一、spring事务的实现方式原理

在使用Spring框架的时候,可以有两种事务的实现方式,一种是编程式事务,有用户自己通过代码来控制事务的处理逻辑,还有一种是声明式事务,通过@Transactional注解来实现。

​ 其实事务的操作本来应该是由数据库来进行控制,但是为了方便用户进行业务逻辑的操作,spring对事务功能进行了扩展实现,一般我们很少会用编程式事务,更多的是通过添加@Transactional注解来进行实现,当添加此注解之后事务的自动功能就会关闭,有spring框架来帮助进行控制。

​ 其实事务操作是AOP的一个核心体现,Spring事务在默认情况下使用CGLIB库来生成代理对象,当一个方法添加@Transactional注解之后,spring会基于这个类生成一个代理对象,会将这个代理对象作为bean,当使用这个代理对象的方法的时候,如果有事务处理,那么会先把事务的自动提交给关系,然后去执行具体的业务逻辑,如果执行逻辑没有出现异常,那么代理逻辑就会直接提交,如果出现任何异常情况,那么直接进行回滚操作,当然用户可以控制对哪些异常进行回滚操作。

1、spring事务的隔离级别

spring中的事务隔离级别就是数据库的隔离级别,有以下几种:

一、READ UNCOMMITTED 读取未提交内容

二、*READ COMMITTED 读取提交内容

三、*REPEATABLE READ 可重复读

四、SERIALIZABLE 可串行化

​在进行配置的时候,如果数据库和spring代码中的隔离级别不同,那么以spring的配置为主。

二、传播机制介绍

多个事务方法相互调用时,事务如何在这些方法之间进行传播,spring中提供了7中不同的传播特性,来保证事务的正常执行:

​ REQUIRED:默认的传播特性,如果当前没有事务,则新建一个事务,如果当前存在事务,则加入这个事务

​ SUPPORTS:当前存在事务,则加入当前事务,如果当前没有事务,则以非事务的方式执行

​ MANDATORY:当前存在事务,则加入当前事务,如果当前事务不存在,则抛出异常

​ REQUIRED_NEW:创建一个新事务,如果存在当前事务,则挂起改事务

​ NOT_SUPPORTED:以非事务方式执行,如果存在当前事务,则挂起当前事务

​ NEVER:不使用事务,如果当前事务存在,则抛出异常

​ NESTED:如果当前事务存在,则在嵌套事务中执行,否则REQUIRED的操作一样

1、 NESTED和REQUIRED_NEW的区别

​ REQUIRED_NEW是新建一个事务并且新开始的这个事务与原有事务无关,而NESTED则是当前存在事务时会开启一个嵌套事务,在NESTED情况下,父事务回滚时,子事务也会回滚,而REQUIRED_NEW情况下,原有事务回滚,不会影响新开启的事务

2、NESTED和REQUIRED的区别

​ REQUIRED情况下,调用方存在事务时,则被调用方和调用方使用同一个事务,那么被调用方出现异常时,由于共用一个事务,所以无论是否catch异常,事务都会回滚,而在NESTED情况下,被调用方发生异常时,调用方可以catch其异常,这样只有子事务回滚,父事务不会回滚。

三、spring事务什么时候会失效

自调用问题:当一个方法在同一个类中通过this关键字进行自调用时,事务的代理不会生效。这是因为Spring事务是基于AOP实现的,通过代理类来管理事务。解决方法是确保自调用的方法通过代理对象调用,而不是直接通过this关键字调用。

非public方法问题:默认情况下,Spring事务只能应用于public方法。如果想在非public方法上使用事务,需要开启AspectJ代理模式。通过在Spring配置中设置<tx:annotation-driven mode=“aspectj”/>,可以使用AspectJ框架来实现事务的代理。

数据库不支持事务:某些数据库可能不支持事务,或者事务的隔离级别有限制。如果在不支持事务的数据库上使用事务,事务将无效。需要确保使用的数据库引擎支持事务,并根据需要设置正确的事务隔离级别。

没有被Spring管理:Spring事务只对由Spring容器管理的Bean起作用。如果一个类实例不是由Spring容器管理,那么事务将不会被应用。确保相关的类被正确地声明为Spring Bean,并由Spring容器进行管理。

异常被吞掉或未定义:默认情况下,Spring事务只会在遇到未被捕获的RuntimeException及其子类时回滚事务。如果异常被捕获并处理,或者抛出的异常没有被定义为RuntimeException,事务将不会回滚。确保在事务方法中适当地抛出RuntimeException或进行异常处理,以确保事务可以回滚。


基于STM32与OV7670的嵌入式视频监控系统设计与实现 本文详细介绍了基于STM32单片机与OV7670摄像头的嵌入式视频监控系统设计与实现。从硬件选型、电路设计到软件开发,涵盖了摄像头驱动、TFT显示优化及图像处理等关键技术,提供了实用的调试技巧和性能优化方案,为低成本、高效率的视频监控系统开发提供完整解决方案。 阅读详情

相关推荐

QGIS003:【02标注工具栏】-标注的样式、放置和属性修改

摘要:文本介绍了QGIS标注的样式、放置和属性修改

qq_31762031的博客 1886

为什么spring事务注解@Transaction只能用在public方法上

今天在看spring事务的时候,发现特意有强调@Transaction注解是只能用在public方法上的,但没有明原因,于是引起了我的好奇心。 在经过我的思考和查阅相关博文确认了原因。 首先,@Transaction一般用在方法上,它只能用在public方法上,那就意味着其不能用在private方法上。于是就可以想一下为什么private方法不可以用用呢? 这时候把思路放到AOP上,spring中很多东西的实现都是依靠AOP,本质上也是依靠代理来实现。事务spring中的实现其实就是生成bean对象的代

或左的博客 8261

SIMATIC-WinCC-Unified-RT-V20安装包-链接地址

内容概要:本文档提供了SIMATIC_WinCC_Unified_RT_V20安装包的下载链接和提取码,通过百度网盘分享ISO镜像文件,方便用户获取该工业控制系统软件的安装资源。;适合人群:需要安装或升级SIMATIC_WinCC_Unified_RT_V20的工业控制领域技术人员或相关从业人员。;使用场景及目标:①为工业控制系统的开发、维护人员提供便捷的软件获取途径;②确保相关人员能够顺利安装或更新SIMATIC_WinCC_Unified_RT_V20版本。;阅读建议:请根据实际需求前往提供的百度网盘链接下载ISO文件,在下载时注意核对链接和提取码的准确性,同时关注网盘的下载提示和指南以顺利完成下载任务。

Spring 事务为啥只对public方法有效

本质跟AOP调用有关:在事务代理对象中有判断代理的方法必须是public修饰,否则返回null

皇家程序猿 1820

Spring事务是怎么实现的?

1.Spring事务底层是基于数据库事务和AOP机制的 2.首先对于使用了@Transactional注解的Bean,Spring会创建一个代理对象作为Bean 3.当调用代理对象的方法时,会先判断该方法上是否加了@Transactional注解 4.如果加了,那么则利用事务管理器创建一个数据库连接 5.并且修改数据库连接的autocommit属性为false,禁止此连接的自动提交,这是实现Spring事务非常重要的一步 6.然后执行当前方法,方法中会执行sql 7.执行完当前方法后,如果没有出现异常就直接

dayuiicghaid的博客 5848

Spring面试Spring事务(图文详解)

一个事务包含两个及两个以上的步骤Spring是没法提供事务的,Spring事务的本质其实就是数据库事务的支持,没有数据库事务支持,spring是无法提供事务功能的。真正的数据库层的事务提交和回滚是通过binlog或者redo log实现的。

丨康有为丨的博客 496

Java最新后端面试每日一题 Spring事务、Mysql事务、分布式事务,rabbitmq分布式事务面试

三个工作日收到了offer,头条面试体验还是很棒的,这次的头条面试好像每面技术都问了我算法,然后就是中间件、MySQL、Redis、Kafka、网络等等。第一个是算法关于算法,我觉得最好的是刷题,作死的刷的,多做多练习,加上自己的理解,还是比较容易拿下的。而且,我貌似是将《算法刷题LeetCode中文版》、《算法的乐趣》大概都过了一遍,尤其是这本。

2401_84689601的博客 877

Java面试实战:Spring Cloud、Redis与分布式事务的那些事

本次面试覆盖了Spring Boot、Spring Cloud、Redis、分布式事务、MyBatis分库分表、WebSocket等核心技术点。通过问答,可以看出候选人在基础技术上掌握良好,但在复杂场景下仍需深入学习。

杨不易呀 1092

java面试:mysql事务的四种隔离级别?Spring事务声明?】

( 当类A中的 a 方法用默认Propagation.REQUIRED模式,类B中的 b方法加上采用 Propagation.REQUIRES_NEW模式,然后在 a 方法中调用 b方法操作数据库,然而 a方法抛出异常后,b方法并没有进行回滚,因为Propagation.REQUIRES_NEW会暂停 a方法的事务 )Propagation.REQUIRED:如果当前存在事务,则加入该事务,如果当前不存在事务,则创建一个新的事务。Propagation.SUPPORTS:如果当前存在事务,则加入该事务

m0_56775120的博客 783

java技术面试第五十四讲】Java面试题54 . Spring事务的传播特性和隔离级别

Java面试题54 :Spring事务的传播特性和隔离级别提前预告,完全免费,写文不易: 如果喜欢、对你有所帮助还请大家点个在看, 好东西要大家共享才能实现它的价值 , 让更多有需要的...

hello world! 672

Java面试场景:深入探讨Spring源码与分布式事务

面试官对候选人的表现给予了高度评价:“你对Spring源码和分布式事务的理解非常深入,尤其是结合实际场景的分析能力令人印象深刻。期待未来有机会合作!本次面试围绕Spring源码和分布式事务展开,候选人的回答展现了深厚的技术功底和丰富的实战经验。面试官通过引导式提问,逐步深入技术细节,最终对候选人的表现给予了高度评价。这场面试不仅是一次技术交流,更是一次学习的机会。

南客先生的博客 740

Java核心技术面试场景:Spring Boot、Kafka与数据库事务整合分析

1. Spring Boot的核心特性自动配置:通过和内置的自动配置模块,开发者无需手工配置大量XML。内嵌服务器:支持Tomcat、Jetty等内嵌Web服务器。健康检查与监控:Actuator模块可以监控应用的运行状态。2. 数据库事务的管理在Spring中,注解用于声明事务,确保一系列数据库操作要么全部成功,要么全部回滚。事务的隔离级别和传播属性是需要重点掌握的内容。3. Kafka的消息处理与事务性ProducerKafka是一种分布式消息队列,常用于异步处理。

yxc2017的博客 874

java面试--spring事务

摘要:事务数据库操作的工作单元,具有ACID特性。Spring通过PlatformTransactionManager、TransactionDefinition等组件管理事务,核心流程包括代理创建和方法拦截。事务的四大属性包括传播行为、隔离级别、超时时间和只读设置。常见失效场景包括非public方法、自调用等。最佳实践建议明确指定属性、避免耗时操作和方法精简。

weixin_38552272的博客 520

Java面试-Spring 事务管理:编程式事务与声明式事务(@Transactional)

本文系统梳理了Spring事务管理的核心概念与实现方式,重点对比了编程式事务与声明式事务的优缺点。编程式事务通过TransactionTemplate或PlatformTransactionManager手动控制,灵活性高但代码侵入性强;声明式事务基于@Transactional注解和AOP实现,简洁优雅但灵活性稍逊。文章详细解析了@Transactional的20+个配置属性,包括传播行为、隔离级别等核心机制,并列举了8种常见的事务失效场景及解决方案。最后通过手写声明式事务切面揭示底层原理,帮助开发者深入

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

Java最全面试官: Spring 事务设计原理?面试必问!,联通java开发面试

由于篇幅原因,就不多做展示了本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录需要这份系统化的资料的朋友,可以点击这里获取//bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**需要这份系统化的资料的朋友,可以点击这里获取。

pckzzy119的博客 278

Java面试——Spring 事务

关于Spring事务的相关知识点总结,包括SpringBoot中开启事务的方式,Spring事务的实现过程,Spring事务的传播机制、隔离级别以及失效的原因

tang_seven的博客 1707

JAVA 面试 Spring事务

因此可以通过rollbackFor来配置需要回滚的异常,与之对应的还有noRollbackFor属性,配置不需要回滚的异常,这两个属性配置的是Class对象,另外还有rollbackForClassName和noRollbackForClassName,通过品类全路径名配置。Spring事务使用分为编程式事务和声明式事务,编程式事务像MySQL的事务一样,显式的通过Start和commit开始和提交,不常用,我们常用的是声明式事务,也就是在方法上加一个@Transactional 来使用。

a_blue_ice的博客 1111
上一篇: 【JAVA面试】SpringIOC的理解
下一篇: 【JAVA面试】SpringBoot自动配置原理
BlackTry.
博客等级 码龄7年 5粉丝 · 51原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值