版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java事务高频面试题及详细答案(实战版)一、事务基础核心面试题1.什么是数据库事务?事务的四大特性(ACID)是什么?参考答案:数据库事务是一组数据库操作的执行单元,这一组操作要么全部执行成功,要么全部执行失败回滚,不会出现部分执行的情况,是保证数据一致性的核心机制。事务四大特性ACID具体含义:原子性(Atomicity):事务是最小执行单元,不可分割。事务内的SQL操作,全部成功则提交,任意一步失败则整体回滚,不会存在中间状态。比如转账场景,扣款和入账必须同时成功或同时失败。一致性(Consistency):事务执行前后,数据库的数据完整性、业务规则必须保持一致。转账前后,两个账户的总金额不变,不会出现资金丢失或凭空增加的情况。隔离性(Isolation):多个事务并发执行时,相互之间互不干扰,每个事务都感知不到其他并发事务的执行状态,数据库通过隔离级别控制并发事务的影响。持久性(Durability):事务一旦提交成功,数据会永久写入数据库,即使服务器宕机、重启,数据也不会丢失。2.Spring事务和数据库原生事务的区别?参考答案:数据库事务是底层基础,只提供最基础的开启、提交、回滚、隔离级别能力,是原生的事务支持;Spring事务是基于数据库事务封装的上层框架事务,是对原生事务的增强和简化。核心区别:数据库事务需要手动写代码控制开启、提交、回滚,代码冗余度高;Spring事务通过注解、配置即可实现事务管理,无需手动硬编码。Spring提供了事务传播机制,解决多层方法调用的事务嵌套问题,这是原生数据库事务不具备的能力。Spring可以自定义事务回滚规则(指定异常才回滚),原生数据库事务默认只针对运行时错误回滚,灵活性更低。Spring事务基于AOP动态代理实现,是声明式事务,解耦业务代码和事务控制代码。3.Spring事务的两种实现方式?各自优缺点?参考答案:Spring事务分为编程式事务和声明式事务两种。1.编程式事务手动通过TransactionTemplate或PlatformTransactionManager编写事务代码,手动控制事务开启、提交、回滚。优点:灵活性极高,可以精准控制事务的执行范围和逻辑;缺点:代码侵入性强,冗余代码多,业务代码和事务代码耦合严重,日常开发极少使用。2.声明式事务基于AOP代理实现,通过@Transactional注解或XML配置实现事务控制。优点:无代码侵入,解耦性好,简洁高效,是项目主流使用方式;缺点:只能作用于public方法,存在部分事务失效场景,底层基于代理,有一定局限性。二、事务隔离级别核心面试题4.数据库并发事务会出现哪些问题?参考答案:并发事务不做隔离时,会出现三类经典数据问题,严重影响数据准确性:脏读:一个事务读取到了另一个事务未提交的修改数据。后续如果对方事务回滚,当前读取的数据就是无效脏数据。不可重复读:同一个事务内,两次读取同一条数据,结果不一致。原因是两次读取之间,其他事务修改并提交了该数据。聚焦于数据修改。幻读:同一个事务内,两次查询同一范围的数据,结果条数不一致。原因是其他事务在该范围内新增或删除了数据并提交。聚焦于数据新增/删除。5.Spring和MySQL的四种事务隔离级别?分别解决什么问题?参考答案:MySQLInnoDB引擎支持四种隔离级别,Spring完全兼容这四种级别,级别从低到高排序:读未提交(READUNCOMMITTED):最低级别,允许读取未提交数据。会出现脏读、不可重复读、幻读,生产环境几乎不用。读已提交(READCOMMITTED):只能读取其他事务已提交的数据。解决脏读,但存在不可重复读、幻读问题。是Oracle默认隔离级别。可重复读(REPEATABLEREAD):同一个事务内,多次读取数据结果一致。解决脏读、不可重复读,存在幻读问题。是MySQLInnoDB默认隔离级别。串行化(SERIALIZABLE):最高隔离级别,事务串行执行,完全杜绝并发问题。解决脏读、不可重复读、幻读,但性能极差,并发场景基本不用。补充:MySQLInnoDB通过MVCC机制,在可重复读级别下,极大缓解了幻读问题,这也是MySQL默认使用该级别的核心原因。三、事务传播机制高频面试题6.什么是事务传播机制?Spring有几种传播机制?参考答案:事务传播机制是指:当一个带有事务的方法被另一个方法调用时,事务如何传递、如何嵌套执行的规则,专门解决多层方法嵌套的事务一致性问题。Spring一共定义7种事务传播机制,日常开发重点掌握5种核心即可:REQUIRED(默认):当前有事务则加入当前事务,没有则新建事务。最常用、默认级别。SUPPORTS:支持事务。当前有事务就加入,没有则以非事务方式执行。MANDATORY:强制事务。当前必须存在事务,否则直接抛出异常。REQUIRES_NEW:新建独立事务。无论当前是否有事务,都会开启一个全新的独立事务,新旧事务互不影响,各自提交回滚。NOT_SUPPORTED:始终以非事务方式执行,若当前存在事务,会挂起原有事务。NEVER:强制非事务,检测到当前有事务则直接报错。NESTED:嵌套事务。当前有事务则嵌套在父事务中执行,拥有独立保存点,可单独回滚;无事务则新建事务。父事务回滚,子事务必须回滚。7.REQUIRED和REQUIRES_NEW、NESTED的核心区别?(高频追问)参考答案:这三个是面试最常对比的传播机制,核心差异在事务独立性:REQUIRED:父子方法共用同一个事务,是同一个事务。任意位置报错,整个事务全部回滚,无法局部回滚。REQUIRES_NEW:父子事务完全独立。子事务开启前挂起父事务,子事务执行完毕恢复父事务。子事务回滚不影响父事务,父事务回滚也不影响已执行完成的子事务。适用于日志记录、异步记录等不受主业务失败影响的场景。NESTED:嵌套事务,依赖父事务。子事务有独立保存点,可单独回滚;但如果父事务回滚,子事务必须强制回滚,无法独立提交。事务独立性弱于REQUIRES_NEW。四、Spring事务失效场景(重中之重,面试必问)8.说说项目中常见的Spring事务失效场景?参考答案:Spring事务基于AOP动态代理实现,所有失效场景本质都是没有走代理对象的方法,导致事务切面无法生效,日常开发中6大高频失效场景:方法不是public修饰
SpringAOP只能拦截public方法,private、protected、default方法上的@Transactional注解完全失效,事务不会生效。类内部方法自调用
A类的a()方法(无事务)直接调用本类的b()方法(加了事务注解),此时b()事务失效。原因是内部调用用的是this原生对象,不是Spring代理对象,切面无法拦截。异常类型不匹配
Spring事务默认只对RuntimeException、Error回滚。如果方法抛出普通Exception检查异常,不手动配置回滚规则,事务不会回滚。异常被try-catch捕获吃掉
方法内部手动try-catch捕获所有异常,没有向外抛出,Spring无法感知到异常,不会触发事务回滚。这是开发中最常见的失误。数据库引擎不支持事务
如果数据表使用MyISAM引擎(不支持事务),即使代码注解、配置全部正确,事务也完全失效。生产环境必须使用InnoDB引擎。传播机制配置不当
比如方法配置了NOT_SUPPORTED、NEVER等非事务传播机制,会强制以非事务方式运行,导致事务失效。9.内部调用导致事务失效,怎么解决?参考答案:核心思路:让方法调用走Spring代理对象,三种常用解决方案:方案一:拆分方法到不同类,A类调用B类的事务方法,天然走代理,最推荐、最规范。方案二:手动获取当前类的代理对象,通过代理对象调用本类事务方法。方案三:开启Spring自代理,配置expose-proxy="true",通过AopContext.currentProxy()获取代理对象调用。10.事务方法try-catch异常后,如何手动回滚事务?参考答案:业务中需要手动捕获异常处理日志,但又需要回滚事务时,有两种方式:手动抛出运行时异常:catch捕获异常后,newRuntimeException(e)向上抛出,触发Spring自动回滚。编程式手动回滚:在catch块中使用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(),手动标记事务回滚,无需抛出异常。五、事务实战与进阶面试题11.大事务有什么问题?项目中如何优化大事务?参考答案:大事务指事务执行时间过长、包含过多数据库操作、业务逻辑过多的事务。大事务的危害:数据库锁持有时间过长,引发行锁、表锁等待,导致接口超时、并发阻塞;数据库事务日志堆积,增加数据库压力,容易引发数据库卡顿;大幅提升幻读、锁冲突概率,降低系统并发能力。优化方案:拆分长事务,将非核心、可独立执行的业务拆分出事务范围;事务内只保留数据库增删改操作,将文件处理、远程调用、日志打印等耗时操作移出事务;批量操作拆分批次,避免单次事务处理海量数据;合理调整隔离级别,在业务允许前提下,降低隔离级别提升并发性能。12.事务中调用远程接口/HTTP请求,有什么问题?怎么解决?参考答案:存在问题:远程接口网络耗时不可控,会极大拉长事务执行时间,造成大事务问题,引发数据库锁等待、并发阻塞、超时问题。同时远程调用失败,容易导致本地事务和远程服务数据不一致。解决方案:将远程调用移出事务范围,保证事务只处理本地数据库操作;引入可靠消息队列、事务消息,实现本地事务和远程业务的最终一致性;增加重试、幂等机制,避免网络抖动导致的数据不一致。13.什么是事务幂等性?如何保证事务幂等?参考答案:事务幂等性指:同一个请求、同一事务多次重复执行,最终数据库数据结果一致,不会产生重复数据、脏数据。重复提交、接口重试、网络重试都会导致事务重复执行,引发数据问题。常用保证方案:数据库唯一索引:通过唯一键约束,拦截重复插入数据;业务幂等号:全局唯一订单号、请求号,执行前先查询是否已处理;状态机控制:通过业务状态判断,已完成的事务不再重复执行;分布式锁:执行事务前加锁,保证同一时间只有一个请求执行。14.讲讲Spring事务的执行原理?参考答案:Spring事务核心
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年湖南省武冈市高三生物下册期末考试模拟卷(含答案)
- 2026年山东省邹城市高三物理下册期末考试模拟检测卷及答案
- 2026年吉林省梅河口市高一化学上册期末考试测试卷附完整答案【全优】
- 2026年山东省滕州市高一化学上册期末考试考试卷附答案(黄金题型)
- 2026年福建省永安市高三生物下册期末考试模拟卷(含答案)
- 2026年云南省瑞丽市高三生物上册期末考试测试卷及参考答案
- 2026年江苏省扬中市高三历史上册期末考试模拟卷及参考答案(轻巧夺冠)
- 2026年山东省莱阳市高一化学上册期末考试模拟考试卷含答案(满分必刷)
- 2026年山东省邹城市高三生物上册期末考试考试卷及答案
- 2026年云南省弥勒市高一化学上册期末考试试卷附参考答案【突破训练】
- 高中美术鉴赏课教学设计:以作品为本位的四步鉴赏法实践
- 2025年城管协管员笔试考试试题(含答案)
- 医疗健康管理与慢病防控
- 2026年认证基础、管理体系认证基础主观题考试(附答案)解析
- 七年级上册人教版英语第一次月考试卷(含答案)
- 2026年急诊超声应用培训课件
- 正压送风口阀体损坏更换安装调试方案
- 2026中考冲刺-九年级数学知识点梳理
- 新学期(2026年秋)小学二年级体育教学工作计划
- 浙江省杭州市2026届高三上学期教学质量检测数学试卷(杭州一模)(含答案)
- 第二届重庆市市场监管系统执法办案电子数据取证技能大竞赛赛完整试题
评论
0/150
提交评论