自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

不朽的博客

IT,女程序员

  • 博客(91)
  • 收藏
  • 关注

原创 【备战大厂JAVA面试MySQL篇】大白话解释一下为什么LIKE以%开头索引会失效,秒懂

LIKE查询以%开头(如LIKE'%abc')会导致索引失效,原因是B+树索引只能利用从左到右的有序性进行前缀匹配查询。当查询条件跳过前缀(如后缀匹配或中间匹配)时,索引无法定位起始位置,只能全表扫描。虽然覆盖索引可以部分优化性能,但建议尽量使用前缀匹配(LIKE'abc%'),或采用全文索引、数据预处理(反转存储)等替代方案。索引失效的本质在于破坏了B+树的有序性,就像字典索引无法查找以指定结尾的单词一样。

2025-10-24 16:46:30 919

原创 【备战大厂JAVA面试MySQL篇】大白话解释一下什么是自适应哈希索引,秒懂

摘要:自适应哈希索引(AHI)是InnoDB存储引擎的自动优化机制,为高频等值查询的热点数据在内存中建立哈希索引,将查询时间复杂度从B+树的O(logn)优化为O(1)。其核心特点是全自动管理、内存级存储、按需构建,适用于高频等值查询和局部热点数据场景,但不支持范围查询。通过监控SHOW ENGINE INNODB STATUS可观察AHI效果,通常无需手动干预,除非系统以范围查询为主或存在高并发锁竞争问题。AHI如同数据库自动发现的"近道",能显著提升高频查询性能。(149字)

2025-10-24 16:32:32 644

原创 【备战大厂JAVA面试MySQL篇】大白话解释一下什么是索引下推,秒懂

索引下推(ICP)是MySQL的查询优化技术,核心原理是将过滤条件提前到索引遍历阶段执行,减少回表次数。适用于使用二级索引且条件包含非前缀列的场景,如联合索引(a,b)查询条件中的b列。通过EXPLAIN可验证ICP效果,开启时Extra字段显示"Using index condition"。主键查询、覆盖索引或条件涉及非索引列时ICP不生效。该技术将部分过滤逻辑下推到存储引擎层,显著降低磁盘IO开销,是MySQL5.6+默认启用的自动优化手段。

2025-10-24 16:24:20 831

原创 【备战大厂JAVA面试MySQL篇】大白话解释一下最佳左前缀法则,秒懂

摘要:最佳左前缀法则是数据库联合索引的查询优化规则,要求查询条件必须从索引第一列开始按顺序使用,不能跳列。联合索引(如(a,b,c))的B+树按a→b→c排序,若跳过a直接查b或c会导致索引失效。验证表明,查询a、a+b或a+b+c时索引生效;仅查b或a+c时索引部分或完全失效。实际应用中,应将高区分度列放索引前部,避免冗余索引。遵循该法则可确保索引高效加速查询,否则可能引发全表扫描。

2025-10-24 16:20:23 426

原创 【备战大厂JAVA面试MySQL篇】大白话解释一下大数据量的批量写会导致什么问题,秒懂

摘要: 大数据量批量操作(如一次性插入/更新百万条数据)易导致数据库资源耗尽,表现为连接超时、内存溢出、锁冲突、IO瓶颈等问题。核心矛盾在于资源占用失控——大量数据集中处理会阻塞数据库连接(如长事务占满连接池)、撑爆内存(OOM)、引发锁竞争(表锁/行锁阻塞其他操作),同时增加日志刷盘和索引维护压力,拖垮整体性能。优化关键在于**“分而治之”**:分批次处理(如每批1000条)、控制事务粒度(单批提交)、临时关闭非关键索引/约束,并监控资源使用,避免“一口吃撑”。通过拆分负载、释放资源,让数据库“细嚼慢咽”

2025-10-24 16:17:34 683

原创 【备战大厂JAVA面试MySQL篇】大白话解释一下如何优化大量数据插入的性能,秒懂

摘要: 优化大数据量插入性能的核心是减少交互次数和额外开销。主要方法包括:1)批量插入,用单条SQL插入多值(如INSERT INTO ... VALUES(...),(...)),减少SQL解析和网络请求;2)手动批量提交事务,关闭自动提交,减少事务日志刷盘次数;3)临时关闭索引和约束,插入完成后再重建,降低实时维护开销;4)MySQL专属LOAD DATA INFILE,直接导入文件,速度提升10-100倍;5)分批次处理(如每批5000条),避免内存溢出。10万条数据优化后,性能可提升20-50倍,百

2025-10-24 16:11:09 648

原创 【备战大厂JAVA面试MySQL篇】大白话解释一下MySQL如何避免死锁,秒懂

MySQL避免死锁的核心在于打破死锁形成的必要条件,主要包括统一锁访问顺序、缩短事务持有时间、控制事务粒度等。死锁产生的四个条件(互斥、持有并等待、不可剥夺、循环等待)中,最关键的干预点是打破循环等待和减少持有并等待时间。具体方法包括:强制按固定顺序加锁(如统一先锁小ID再锁大ID)、将大事务拆分为小事务快速释放锁、避免在事务中执行耗时操作、设置合理的事务超时时间等。此外,使用行锁替代表锁、分离读写操作也是有效手段。当死锁发生时,MySQL会通过等待图检测并自动回滚代价较小的事务来恢复。这些措施本质是通过规

2025-10-23 17:37:52 584

原创 【备战大厂JAVA面试MySQL篇】大白话解释一下如何优化MySQL的表结构,秒懂

MySQL表结构优化核心是通过合理设计字段类型、减少冗余、优化索引和拆分大表等手段,提升存储效率和查询性能。具体包括:1)精准选择字段类型(如用tinyint存年龄);2)消除冗余数据,通过外键关联;3)垂直拆分冷热字段,水平分表降低单表数据量;4)设置NOT NULL和DEFAULT值;5)优先选用InnoDB引擎。优化后能显著减少存储空间、降低IO开销,并为后续索引优化奠定基础,需在范式化和查询性能间取得平衡,避免过度拆分和滥用大字段类型。

2025-10-23 17:33:54 555

原创 【备战大厂JAVA面试MySQL篇】大白话解释一下什么是二叉树,B树,B+树,哈希表,秒懂

本文介绍了四种常见的数据结构:二叉树、B树、B+树和哈希表,用通俗易懂的比喻解释其特点。二叉树是基础的分叉结构,适合简单场景但易失衡;B树通过多路平衡优化磁盘存储,非叶子节点存数据;B+树是B树的升级版,叶子节点链式连接,特别适合数据库的范围查询;哈希表通过哈希函数直接定位数据,单值查询最快但不支持范围查询。四种结构各有优劣,适用于不同场景:二叉树简单直观,B树/B+树适合数据库索引,哈希表适合快速单值查询。

2025-10-23 17:23:04 543

原创 【备战大厂JAVA面试MySQL篇】大白话解释一下为什么MySQL选择B+树作为索引,秒懂

MySQL选择B+树作为索引的核心原因在于其高度适配数据库特性。B+树通过"矮胖"结构(3-4层即可存储千万数据)最小化磁盘IO次数;自平衡特性确保查询稳定;叶子节点链式存储支持高效范围查询;非叶子节点仅存索引键提升空间利用率。相比B树、二叉树和哈希表,B+树在磁盘IO效率、查询稳定性、范围查询性能等方面表现更优,完美平衡了数据库的读写需求,成为MySQL索引的最优解。

2025-10-23 17:08:23 242

原创 【备战大厂JAVA面试MyBatis篇】大白话解释一下如何设置MyBatis中的执行器类型,秒懂

MyBatis的执行器类型决定了SQL语句的执行策略,主要有三种:SIMPLE(默认)每次执行都新建Statement,适合普通查询;REUSE会复用相同SQL的Statement,减少对象创建开销;BATCH批量处理SQL,提升大批量操作性能。可通过SqlSessionFactory.openSession()动态指定,或在配置文件中设置默认类型。使用时需注意:BATCH类型需手动提交事务,查询操作会提前触发批量SQL执行。合理选择执行器类型能显著提升数据库操作效率。

2025-10-23 11:51:19 246

原创 【备战大厂JAVA面试MyBatis篇】大白话解释一下对MyBatis的执行器的理解,秒懂

摘要:MyBatis执行器是SQL执行的核心调度组件,负责协调SQL处理全流程(参数处理、执行、结果映射)、事务管理和一级缓存。提供三种基本执行器类型:SimpleExecutor(默认,每次新建Statement)、ReuseExecutor(复用Statement)、BatchExecutor(批量执行),以及CachingExecutor装饰器(支持二级缓存)。执行器通过不同策略优化数据库操作,如批量处理减少交互次数、缓存机制提升查询效率。理解执行器工作原理有助于针对不同场景选择最优执行策略,提升My

2025-10-23 11:48:04 396

原创 【备战大厂JAVA面试MyBatis篇】大白话解释一下当属性名和字段名不一致怎么办,秒懂

摘要: MyBatis中Java实体类属性名与数据库字段名不一致时,查询结果映射会失败(属性为null)。解决方法: resultMap映射:通过XML配置属性与字段的对应关系,灵活支持复杂场景; SQL别名:在SQL中为字段起别名与属性名一致,适合简单查询; 驼峰自动映射:开启配置后,自动转换下划线命名(user_name)为驼峰命名(userName)。 对比: resultMap通用性强但需维护配置; 别名简单但SQL冗余; 驼峰映射适合命名规范统一的场景。 推荐:复杂场景用resultMap,简单场

2025-10-23 11:43:05 763

原创 【备战大厂JAVA面试MyBatis篇】大白话解释一下MyBatis编程步骤是怎样的,秒懂

MyBatis编程四步走:配置环境→定义实体→绑定接口→调用执行。首先配置数据库连接和Mapper路径;然后创建与表对应的实体类;接着定义Mapper接口并绑定SQL语句;最后通过SqlSession调用接口方法自动执行SQL。整个过程通过动态代理实现接口与SQL的映射,相比JDBC省去了重复代码,只需关注接口定义和SQL编写即可完成数据库操作。关键注意配置文件路径正确、接口与XML严格绑定,以及及时关闭会话资源。

2025-10-23 11:39:45 459

原创 【备战大厂JAVA面试MyBatis篇】大白话解释一下对传统JDBC开发的不足,秒懂

传统JDBC开发存在代码冗余、资源管理复杂、SQL与Java代码耦合、异常处理繁琐、结果映射手动化等问题。具体表现为:每次操作数据库都要重复加载驱动、获取连接等固定代码;必须手动关闭资源,容易导致连接泄漏;SQL硬编码在Java中,维护困难;参数设置和结果映射繁琐易错;事务管理手动化容易出现数据不一致。这些问题严重影响开发效率、系统性能和可维护性。而MyBatis等ORM框架通过自动资源管理、SQL与代码分离、自动参数绑定等功能,有效解决了这些痛点,让开发者能更专注于业务逻辑。

2025-10-23 11:37:33 657

原创 【备战大厂JAVA面试MyBatis篇】大白话解释一下对MyBatis架构设计的理解,秒懂

摘要:MyBatis采用三层架构设计实现高效数据库操作。接口层(如SqlSession和Mapper)为开发者提供调用入口;核心处理层(Executor、StatementHandler等)负责SQL解析、执行和结果映射;基础支持层(Configuration、TypeHandler等)提供配置管理和资源支持。这种分层设计实现了组件解耦,通过动态代理简化调用流程,同时支持插件扩展,兼具灵活性和轻量级优势。典型查询流程展示各层协作:Mapper接口调用→Executor调度→StatementHandler执

2025-10-23 11:34:46 365

原创 【备战大厂JAVA面试MyBatis篇】大白话解释一下不同Mapper中的id是否可以相同,秒懂

MyBatis允许不同Mapper文件中使用相同的SQL ID,其核心原理是通过"命名空间(namespace)+ID"的组合实现唯一标识。不同Mapper的命名空间相当于不同文件夹,即使ID相同也不会冲突。示例显示UserMapper和OrderMapper可以同时定义selectById方法,MyBatis能正确区分执行。但同一Mapper内ID必须唯一,否则会报错。这种设计类似于文件系统的路径管理,既保证了SQL的隔离性,又提高了开发灵活性。

2025-10-23 11:31:58 274

原创 【备战大厂JAVA面试MyBatis篇】大白话解释一下如何获取MyBatis中自增的主键,秒懂

MyBatis获取自增主键的核心是通过数据库的自增机制与参数回填功能实现的。对于MySQL等支持自增主键的数据库,使用useGeneratedKeys="true"和keyProperty属性自动获取主键并回填到实体类;对于Oracle等使用序列的数据库,则通过<selectKey>标签在插入前获取序列值。关键点包括:实体类必须有setter方法,事务提交后主键才生效,批量插入时也能自动回填多个主键。这两种方式都能在插入数据后自动获取主键值,无需手动查询,极大简化了开发流程。

2025-10-23 11:29:03 332

原创 【备战大厂JAVA面试MyBatis篇】大白话解释一下使用MyBatis的mapper接口调用时有哪些要求,秒懂

MyBatis Mapper接口调用需遵循五大规范:1)接口与映射文件/注解严格绑定,namespace或注解必须对应;2)方法名与SQL标签id完全一致;3)参数需用@Param明确标注,多参数必须注解;4)返回值需匹配查询结果(单条/多条);5)接口必须被扫描注册。这些规范确保MyBatis能正确关联接口方法与SQL,处理参数映射和结果转换。常见错误包括命名不一致、参数未标注、返回值类型不匹配等,都会导致BindingException或NullPointerException。遵循这些"暗号

2025-10-23 11:23:10 296

原创 【备战大厂JAVA面试MyBatis篇】大白话解释一下MyBatis中的插件原理,秒懂

摘要: MyBatis插件基于拦截器模式,通过动态代理拦截核心组件(Executor、StatementHandler等)的特定方法,在不修改源码的前提下扩展功能。开发者需实现Interceptor接口,通过@Intercepts注解指定拦截目标(如SQL执行、参数处理等),在intercept方法中添加自定义逻辑(如打印日志、分页改造)。插件按配置顺序形成代理链,支持多插件协作。典型应用包括分页(PageHelper)、SQL日志、数据权限等,但需注意仅能拦截4类组件的指定方法,过度使用可能影响性能。其核

2025-10-23 11:18:57 628

原创 【备战大厂JAVA面试MyBatis篇】大白话解释一下你对SqlSessionFactory的理解,秒懂

摘要: SqlSessionFactory是MyBatis的核心工厂,负责创建和管理数据库会话(SqlSession)。它基于全局配置(如数据库连接、SQL映射规则)构建,是线程安全的单例对象,通过openSession()方法生成SqlSession,隐藏了底层连接和执行的复杂细节。关键特性包括线程安全、单例模式、统一配置管理。使用时需通过SqlSessionFactoryBuilder解析配置文件初始化,产生的SqlSession需手动关闭。其核心价值在于集中配置、简化会话创建流程,并保障多线程环境下的

2025-10-23 11:07:00 370

原创 【备战大厂JAVA面试MyBatis篇】大白话解释一下Mybatis中涉及的设计模式,秒懂

MyBatis通过多种设计模式实现了代码解耦和功能扩展。工厂模式(SqlSessionFactory)封装对象创建逻辑;代理模式(MapperProxy)为Mapper接口动态生成实现;建造者模式(SqlSessionFactoryBuilder)分步构建复杂配置;模板方法模式(BaseExecutor)定义SQL执行流程框架;装饰器模式(CachingExecutor)动态添加缓存等功能。这些模式共同提升了MyBatis的灵活性(支持不同执行策略)、扩展性(可添加新功能)和可维护性(逻辑解耦),使其成为高

2025-10-22 16:54:22 746

原创 【备战大厂JAVA面试MyBatis篇】大白话解释一下MyBatis的分页原理,秒懂

MyBatis分页的核心原理是通过数据库原生语法或拦截器自动添加分页条件,只查询指定范围的数据。主要有两种实现方式:一是手动在SQL中拼接LIMIT等分页语法,简单直接但需自行处理总条数查询;二是使用PageHelper插件,通过拦截器自动修改SQL并计算分页信息,支持多数据库适配。分页能有效减少数据传输量,提升查询效率,特别适合大数据量场景。实际开发推荐使用PageHelper,只需调用startPage()即可自动完成分页逻辑,大幅简化代码。

2025-10-22 16:51:12 872

原创 【备战大厂JAVA面试MyBatis篇】大白话解释一下MyBatis中的延迟加载,秒懂

摘要:MyBatis延迟加载是一种按需查询关联数据的机制,仅在首次访问关联属性时执行SQL(如用户查订单)。核心原理是通过动态代理暂时代理关联对象,调用getter方法时触发查询。需在配置中开启lazyLoadingEnabled并关闭aggressiveLazyLoading,通过<collection select>指定关联查询。适用于关联数据不常用或数据量大的场景,需注意SqlSession生命周期和N+1查询问题。本质是“用多少查多少”,优化数据库资源。(149字)

2025-10-22 16:43:31 890

原创 【备战大厂JAVA面试MyBatis篇】大白话解释一下如何解决SqlSession的数据不安全问题,秒懂

MyBatis中SqlSession存在线程安全问题,多线程共享同一SqlSession会导致数据查询/修改混乱,如脏读、事务干扰等问题。解决方案是让每个线程独享SqlSession:1)手动方式,每个线程独立创建和关闭SqlSession;2)推荐使用Spring的SqlSessionTemplate,通过ThreadLocal实现线程隔离,自动管理生命周期。实际开发中应优先采用SqlSessionTemplate方案,既安全又便捷。

2025-10-22 16:38:07 354

原创 【备战大厂JAVA面试Mybatis篇】大白话解释一下MyBatis中的缓存设计,秒懂

MyBatis采用两级缓存机制提升查询性能:一级缓存是SqlSession级别的本地缓存,在同一个会话中复用查询结果;二级缓存是跨会话的共享缓存,需手动开启,适合频繁查询但更新较少的数据。缓存执行顺序为:先查二级缓存,再查一级缓存,最后才访问数据库。核心价值在于减少数据库压力并提升响应速度,但需注意更新操作会清空相关缓存以保证数据一致性。合理配置缓存策略能显著优化系统性能。

2025-10-22 16:34:29 644

原创 【备战大厂JAVA面试MyBatis篇】大白话解释一下MyBatis的自动过程,秒懂

MyBatis通过配置文件驱动、动态代理和映射机制,实现Java方法到SQL执行的自动化流程。开发者只需定义Mapper接口和SQL映射,MyBatis自动完成数据库连接、SQL执行和结果转换等繁琐操作,无需手动编写JDBC代码。其核心流程分为三个阶段:初始化阶段读取配置构建会话工厂;执行阶段通过代理对象自动处理参数映射和SQL执行;结果阶段自动将数据库结果转为Java对象。相比手动JDBC,MyBatis大幅简化了数据库操作,既保留了SQL灵活性,又避免了冗余代码。

2025-10-22 16:17:19 876

原创 【备战大厂JAVA面试分布式篇】大白话解释一下什么是CAP定理,秒懂

CAP定理指出分布式系统无法同时满足一致性(C)、可用性(A)和分区容错性(P)。文章通过银行网点案例说明:当网络故障时,系统只能在CP(保证一致性暂停服务)或AP(继续服务但数据不一致)间选择。Java代码模拟了网络正常/断开时不同取舍的场景,解释了银行系统通常选择CP保证数据准确,而电商系统可能选择AP确保服务可用。最终指出分布式系统需要在一致性和可用性之间做出权衡。

2025-10-21 11:51:37 286

原创 【备战大厂JAVA面试分布式篇】大白话解释一下数据库如何处理大数据量,秒懂

数据库处理大数据量是 **“存储 - 索引 - 计算 - 架构”** 的协同优化:通过分区分表实现数据 “减负”,通过索引加速查询定位,通过并行计算与分布式架构提升处理能力,最终在 “容量、性能、可用性” 之间达成平衡。实际场景中需结合数据特性(如冷热、读写比例)、业务需求(如延迟、一致性)选择适配方案,而非单一技术堆砌。东西分开放、找时有目录、算账多人帮、干活分分工、平时多维护,再大的量也能扛住。

2025-10-21 11:48:16 661

原创 【备战大厂JAVA面试分布式篇】大白话解释一下什么是令牌桶算法,秒懂

摘要:令牌桶算法是一种灵活的限流机制,通过固定速率生成令牌(如每秒5个)和桶容量限制(如20个)来控制请求处理。当请求到达时,若有令牌则立即处理,否则拒绝,未用完的令牌可累积应对突发流量。该算法既能保证长期平均处理速率,又能短期应对流量高峰。Java实现展示了令牌动态生成和请求处理逻辑,通过时间差计算新增令牌数并保证不超过桶容量。相比漏桶算法,令牌桶更适合需要突发处理的场景,但配置参数需合理(如Nginx限流即采用此思想)。其核心思想类似"带备用金的工资卡",平衡了稳定性和灵活性。

2025-10-21 11:24:34 277

原创 【备战大厂JAVA面试分布式篇】大白话解释一下什么是滑动时间窗口算法,秒懂

滑动时间窗口算法通过将总时间窗口划分为连续小窗口(如1分钟拆为6个10秒窗口),动态统计最近时间段内的请求总量进行限流。核心原理是:1)定期滑动时间范围,移除过期小窗口数据;2)统计剩余窗口请求总数;3)超过阈值则限流。相比固定窗口算法,能有效解决临界时间点请求突增问题,实现更精准的流量控制。Java实现采用ConcurrentHashMap存储各窗口计数,通过原子操作保证线程安全。该算法平衡了限流精度与实现复杂度,适合需要平滑控制流量的场景。

2025-10-21 11:17:51 271

原创 【备战大厂JAVA面试分布式篇】大白话解释一下什么是固定时间窗口限流算法(计数器),秒懂

固定时间窗口限流算法通过设定固定时间段内的最大请求次数实现限流(如1分钟100次)。核心机制是将时间划分为固定窗口(如每分钟),每个窗口独立计数,超限请求被拒绝,窗口切换时计数清零。算法实现简单高效,但存在窗口临界问题(请求可能集中在窗口切换前后突发)和限流不够平滑的缺点。Java示例使用ConcurrentHashMap存储窗口计数,通过时间戳计算窗口起始点,确保线程安全。该算法适合简单场景,但对流量突发控制较弱。

2025-10-21 11:15:45 472

原创 【备战大厂JAVA面试分布式篇】大白话解释一下常用的负载均衡算法有哪些,秒懂

负载均衡算法就像食堂窗口分配员,把请求合理分到不同服务器。主要有6种方法:1.轮询(依次分配);2.加权轮询(给能力强的多派活);3.随机分配;4.最少连接(哪个窗口人少就去哪);5.加权最少连接(考虑能力和当前负载);6.IP哈希(固定IP去固定服务器)。简单场景用轮询/随机,服务器配置不同用加权,请求处理时间差异大用最少连接,需要会话保持用IP哈希。

2025-10-21 11:04:34 388

原创 【备战大厂JAVA面试分布式篇】大白话解释一下分布式id的生成方案有哪些,秒懂

分布式ID是用于多系统、多数据库场景的唯一标识符,常见生成方案包括:1)数据库自增ID(简单但有单点风险);2)数据库集群自增(改进后仍扩容困难);3)UUID(无依赖但存储效率低);4)雪花算法(主流方案,高性能有序生成);5)Redis自增(需确保持久化)。选择依据主要考虑并发量、系统依赖和扩展需求,其中雪花算法因其高性能和分布式友好性成为互联网公司的首选方案。

2025-10-20 14:00:01 708

原创 【备战大厂JAVA面试分布式篇】大白话解释一下消息队列和事件表实现分布式事务,秒懂

【摘要】消息队列+事件表模式通过"先记录后执行"机制实现分布式事务的一致性。核心流程:1)主服务在事件表记录待办事项;2)通过消息队列通知从服务执行;3)根据反馈更新状态,失败则重试或补偿。该方案优势在于:异步处理提升性能、事件表防消息丢失、支持服务宕机恢复。关键注意事项包括从服务需实现幂等操作、事件表需优化查询效率。适用于电商等最终一致性场景,以"记录-通知-重试"机制确保跨服务操作最终完成。(150字)

2025-10-20 13:51:52 696

原创 【备战大厂JAVA面试分布式篇】大白话解释一下什么是补偿性事务,秒懂

补偿性事务就是 “走一步看一步,错了就回头补救”,核心是用 “反向操作” 撤销之前的成功步骤,避免出现 “部分成功” 的烂账。它不像 “两阶段提交” 那样提前确认,而是 “先执行再补救”,灵活度高(能跨不同系统、第三方接口),但需要提前定义好反向操作,还要处理补偿失败的情况,适合大部分分布式业务场景(比如电商、订单、支付)。

2025-10-20 11:46:46 719

原创 【备战大厂JAVA面试分布式篇】大白话解释一下什么是两阶段提交协议,秒懂

两阶段提交协议(2PC)通过"先投票后执行"机制确保分布式事务的一致性。类比朋友聚餐AA制:组织者先确认每人能否转账(准备阶段),再统一执行转账或取消(提交/回滚阶段)。技术实现中,协调者负责指挥,参与者(如支付、库存服务)先预执行操作但不提交,根据投票结果决定最终提交或回滚。虽然逻辑简单,但存在协调者单点故障和性能瓶颈问题,实际应用中多采用改进方案(如三阶段提交、TCC等),仅在对一致性要求极高且并发低的场景(如银行转账)使用。

2025-10-20 11:44:11 910

原创 【备战大厂JAVA面试分布式篇】大白话解释一下你对分布式事务的理解,秒懂

摘要:分布式事务解决跨系统操作的一致性问题,确保多个操作要么全部成功,要么全部失败。典型场景如电商下单涉及支付、库存和订单系统,需保证扣款、减库存和生成订单三个操作的一致性。常见方案包括TCC模式(预占资源+确认/取消)和可靠消息最终一致性(通过消息队列保证最终同步)。选择方案需权衡强一致性与最终一致性,核心目标是防止"部分成功"导致数据混乱。分布式事务本质是为跨服务操作提供全局保障,避免数据不一致问题。

2025-10-20 11:41:02 781

原创 【备战大厂JAVA面试分布式篇】大白话解释一下分布式幂等性如何设计,秒懂

摘要:分布式系统中的幂等性确保同一操作执行多次结果一致,防止重复扣款、重复发货等问题。常用6种实现方法:1)唯一请求ID(如支付订单);2)业务唯一键(如限购商品);3)状态机流转(如订单状态);4)悲观锁(严格并发控制);5)乐观锁(版本号校验);6)一次性令牌(防重复提交)。核心思路是为每个操作建立唯一标识,先查后执,根据业务场景选择合适方案,如支付用请求ID、抢购用乐观锁、表单提交用令牌等。

2025-10-20 11:32:45 681

原创 【备战大厂JAVA面试Spring篇】大白话解释一下Import注解,秒懂

摘要: @Import是Spring中用于显式导入配置类或Bean定义的工具,解决自动扫描无法覆盖的场景。支持三种用法:1)直接导入普通类,自动注册为Bean;2)导入配置类,批量加载其中定义的Bean;3)通过ImportSelector动态选择导入类(如按环境加载不同配置)。与@ComponentScan相比,@Import更灵活,可强制导入第三方库或未注解的类,适用于模块化配置、条件化装配等场景,是Spring模块化与扩展性的关键机制。

2025-10-17 12:02:55 591

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除