分布式事务详解

ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花

一、分布式事务的定义与核心问题

1.1 定义

分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统节点上,跨多个独立数据库或服务的事务操作,核心要求是所有参与方要么全部成功提交,要么全部失败回滚,以保证数据的一致性。简单来说,当一个业务操作需要同时调用多个分布式服务(如电商下单需调用订单、库存、支付、积分4个服务),且要求这些操作的结果统一(要么都成功,要么都失败)时,就需要通过分布式事务来保障。

1.2 与本地事务的区别

本地事务(单机事务)是在单一数据库或服务内完成的操作,依托数据库自身的事务机制(如MySQL的InnoDB引擎)就能满足ACID特性;而分布式事务面临跨节点、跨网络的场景,存在网络延迟、节点故障、数据分区等不可控因素,无法直接依赖单一数据库的事务机制,其核心挑战是如何在分布式环境中协调多个节点的事务状态,确保数据一致性。

1.3 核心问题

分布式事务的核心矛盾的是“分布式环境的不可靠性”与“数据一致性需求”的冲突,具体表现为:网络分区导致节点间通信失败、节点故障导致事务中断、并发操作引发的数据不一致、事务超时导致的资源阻塞等,这些问题都会导致分布式事务无法正常满足ACID特性,进而引发业务异常(如超卖、漏扣钱、积分与订单状态不匹配等)。

二、分布式事务的核心理论基础

2.1 ACID特性在分布式场景的困境

ACID是事务的四大核心特性,在分布式场景下,严格的ACID难以实现,各特性面临不同挑战:

  • 原子性(Atomicity):需保证所有节点的操作要么全部完成,要么全部回滚,但网络故障可能导致部分节点执行成功、部分节点执行失败,无法同步回滚。
  • 一致性(Consistency):事务执行后系统需从一个一致状态转换到另一个一致状态,但分布式节点间的数据同步存在延迟,可能出现短暂的不一致。
  • 隔离性(Isolation):并发事务需相互隔离,避免脏读、幻读,但分布式环境中多个节点的并发操作难以统一控制,隔离性难以保障。
  • 持久性(Durability):事务提交后结果需永久存储,但若提交后节点故障,可能导致数据丢失或未同步到其他节点。

2.2 CAP定理

CAP定理是分布式系统设计的基础,指出分布式系统中无法同时满足以下三个特性,最多只能满足两个:

  • 一致性(Consistency):所有节点同时看到相同的数据,即数据更新后,所有节点的读取结果一致。
  • 可用性(Availability):任何节点故障后,其他节点仍能正常提供服务,用户请求总能得到响应。
  • 分区容忍性(Partition Tolerance):网络分区(节点间无法通信)发生时,系统仍能正常运行,不影响整体服务。

在实际分布式系统中,网络分区是不可避免的(必须满足分区容忍性P),因此只能在一致性(C)和可用性(A)之间做权衡:金融支付等核心场景优先保证一致性(CP),电商订单、物流等场景优先保证可用性(AP),通过最终一致性弥补数据同步延迟。

2.3 BASE理论

BASE理论是对CAP定理的补充,针对AP场景提出,通过牺牲严格的一致性,实现最终一致性,核心包含三个要点:

  • 基本可用(Basically Available):系统出现故障时,允许部分功能降级(如限流、降级非核心接口),但核心功能仍能正常使用。
  • 软状态(Soft State):允许数据存在中间状态(如订单“支付中”、库存“冻结中”),中间状态不影响系统整体可用性。
  • 最终一致性(Eventually Consistent):系统中的数据经过一段时间的同步后,最终会达到一致状态,允许短暂的不一致,但需在有限时间内完成同步。

BASE理论是大多数分布式事务解决方案的核心指导思想,如TCC、SAGA、本地消息表等方案,均基于BASE理论实现最终一致性。

三、分布式事务的核心角色

分布式事务的执行需要多个角色协同工作,核心角色分为三类,不同方案中角色名称略有差异,但核心职责一致:

  • 事务管理器(TM,Transaction Manager):全局事务的发起者和协调者,负责定义全局事务的边界(开始、提交、回滚),协调所有资源管理器的状态,决定全局事务的最终提交或回滚。在Seata框架中,TM通过注解标记事务边界,触发全局事务的创建与协调。
  • 资源管理器(RM,Resource Manager):分布式事务的参与者,负责管理本地资源(如数据库、消息队列),执行本地事务操作,并向事务管理器反馈本地事务的执行状态(成功/失败),接收事务管理器的提交或回滚指令。通常指数据库或其他资源持有者,如MySQL、Redis等。
  • 应用程序(AP,Application):业务层代码,负责调用多个分布式服务,触发分布式事务的执行,是事务的实际发起者(如电商下单接口,调用订单、库存、支付服务,触发分布式事务)。

四、主流分布式事务解决方案(原理+优缺点+适用场景)

目前主流的分布式事务解决方案分为两大类:强一致性方案(牺牲可用性,适用于核心场景)和最终一致性方案(牺牲严格一致性,适用于高可用场景),以下逐一详解:

4.1 两阶段提交(2PC,Two-Phase Commit)—— 强一致性方案

4.1.1 核心原理

2PC是最经典的分布式事务协议,核心思路是“投票+决策”,将分布式事务拆分为两个阶段(准备阶段、提交阶段),由事务管理器(TM)协调所有资源管理器(RM),确保所有参与者要么同时提交,要么同时回滚,本质是将分布式事务转化为多个本地事务的协同执行,提供强一致性保障。

4.1.2 执行流程

  1. 准备阶段(Prepare Phase):TM向所有RM发送“准备”请求;每个RM在本地执行事务操作(如更新数据),但不实际提交,仅记录Undo/Redo日志(用于回滚或提交),执行完成后,向TM反馈“准备成功”(Yes)或“准备失败”(No);若RM执行失败或超时,直接反馈失败。
  2. 提交阶段(Commit Phase):TM汇总所有RM的反馈结果,若所有RM均反馈“准备成功”,TM向所有RM发送“提交”指令,RM正式提交本地事务,释放资源,并反馈“提交成功”;若任一RM反馈“准备失败”或超时,TM向所有RM发送“回滚”指令,RM根据Undo日志回滚本地事务,释放资源,并反馈“回滚成功”。

4.1.3 优缺点

  • 优点:原理简单、易于理解和实现,能保证强一致性,广泛用于数据库和消息中间件中,侵入性低(无需修改业务代码)。
  • 缺点:① 同步阻塞:准备阶段后,RM的资源(如数据库锁)会一直处于阻塞状态,直到收到TM的提交/回滚指令,影响系统性能;② 单点故障:TM是核心,若TM在准备阶段完成后、提交阶段开始前宕机,RM会无限阻塞,导致资源无法释放;③ 数据不一致风险:提交阶段若网络故障,部分RM未收到“提交”指令,会导致已收到指令的RM提交、未收到的RM阻塞,最终数据不一致;④ 不支持故障恢复,TM宕机后无法恢复事务状态。

4.1.4 适用场景

适用于对一致性要求极高、参与者较少(避免长时间阻塞)、低并发的场景,如金融转账、银行对账等核心业务,不适用于高并发、高可用的分布式系统(如电商核心链路)。

4.2 三阶段提交(3PC,Three-Phase Commit)—— 强一致性方案(2PC改进版)

4.2.1 核心原理

3PC是为解决2PC的同步阻塞和单点故障问题而设计的改进方案,核心优化是引入“超时机制”和“预提交阶段”,将2PC的两个阶段扩展为三个阶段(CanCommit、PreCommit、DoCommit),减少阻塞时间,提升系统可用性,但仍无法完全避免数据不一致问题,本质仍是强一致性方案。

4.2.2 执行流程

  1. CanCommit阶段(询问阶段):TM向所有RM发送CanCommit请求,询问RM是否能执行事务;RM检查自身资源(如锁可用性),若能执行则反馈Yes,否则反馈No;若有RM反馈No或超时,TM直接发送Abort指令中断事务。
  2. PreCommit阶段(预提交阶段):若所有RM均反馈Yes,TM向所有RM发送PreCommit请求;RM执行事务操作但不提交,记录日志,并反馈ACK;若所有ACK到位,进入提交阶段;若有失败或超时,TM发送Abort指令中断事务。
  3. DoCommit阶段(提交阶段):TM向所有RM发送DoCommit请求;RM正式提交事务,释放资源,并反馈ACK;若所有ACK正确,事务完成;若有No或超时,TM发送Abort指令回滚;此外,RM在PreCommit或DoCommit阶段超时,PreCommit超时会回滚,DoCommit超时会默认提交(假设PreCommit已成功)。

4.2.3 优缺点

  • 优点:引入超时机制,减少RM的阻塞时间(PreCommit超时回滚、DoCommit超时默认提交);缓解了2PC的单点故障问题(TM宕机后,RM可根据超时规则自主决策)。
  • 缺点:① 实现复杂,增加了系统复杂度;② 仍存在数据不一致风险(如RM与TM断连后,部分RM默认提交、部分RM回滚);③ 性能提升有限,仍存在同步阻塞问题,实际应用中较少采用。

4.2.4 适用场景

与2PC类似,适用于强一致性优先、对可用性有一定要求,但参与者较少的场景,目前实际生产中应用较少,多被更优的方案替代。

4.3 TCC补偿机制(Try-Confirm-Cancel)—— 最终一致性方案

4.3.1 核心原理

TCC是一种基于业务补偿的柔性事务方案,是2PC的业务层变种,核心思路是将分布式事务拆分为三个业务方法(Try、Confirm、Cancel),由业务代码自主控制事务的提交与回滚,不依赖数据库的事务机制,将数据库层的事务逻辑提升到业务层,避免长事务锁定的性能瓶颈,实现最终一致性。

4.3.2 核心方法(以电商支付为例)

  • Try阶段(尝试阶段):检查并锁定资源,设置预备状态,确保后续操作可执行。例如,订单服务将订单状态设为“更新中”,库存服务冻结部分库存(新增冻结字段),支付服务预扣减用户余额,积分服务预增加用户积分,不实际提交业务操作。
  • Confirm阶段(确认阶段):若所有RM的Try阶段均执行成功,TM触发Confirm方法,确认执行业务操作,将预备资源转为实际消耗。例如,订单状态改为“支付成功”,扣减冻结库存,确认扣减余额、增加积分,该方法需保证幂等性(重复执行不影响结果)。
  • Cancel阶段(取消阶段):若任一RM的Try阶段执行失败,TM触发Cancel方法,回滚Try阶段的操作,释放锁定的资源。例如,订单状态恢复为“待支付”,释放冻结库存,解冻预扣减的余额、扣减预增加的积分,同样需保证幂等性。

4.3.3 优缺点

  • 优点:无同步阻塞,性能高(Try阶段仅锁定资源,不阻塞业务);灵活性高,可根据业务场景定制补偿逻辑;支持跨数据库、跨服务的复杂事务,适用于高并发场景。
  • 缺点:开发成本高,侵入性强(需手动编写Try、Confirm、Cancel三个方法);与业务紧耦合,业务逻辑变更时,补偿逻辑需同步修改;需处理幂等性、空回滚、悬挂等问题,增加开发复杂度。

4.3.4 适用场景

适用于高并发、对性能要求高、业务逻辑复杂的场景,如电商支付、金融转账、订单履约等,尤其适合无法使用数据库事务的跨服务、跨数据源场景(如MySQL+Redis混合使用)。

4.4 SAGA模式—— 最终一致性方案(长事务专用)

4.4.1 核心原理

SAGA模式是针对长事务场景的分布式事务解决方案,核心思路是将分布式长事务拆分为一系列独立的本地事务(每个本地事务对应一个服务的操作),每个本地事务都有对应的补偿事务(用于回滚该本地事务的操作);正向流程按顺序执行所有本地事务,若某一步本地事务执行失败,则反向执行对应的补偿事务,撤销前面所有本地事务的执行结果,实现最终一致性。

4.4.2 实现方式

  • 编排式:由一个中心化的“编排器”(如流程引擎)协调所有本地事务的执行与补偿,编排器负责管理事务流程、触发正向/反向操作,优点是流程清晰、易于维护,缺点是编排器可能成为单点故障。
  • 协同式:各服务之间通过消息直接通信,自主决定下一步执行或补偿,无中心化节点,优点是去中心化、高可用,缺点是流程分散、难以维护,适用于简单的长事务场景。

4.4.3 优缺点

  • 优点:无锁阻塞,性能高;天然支持长事务(如订单履约流程:下单→支付→扣库存→物流发货);支持异步执行,适配微服务架构;容错性强,某一步失败后可针对性补偿。
  • 缺点:仅能保障最终一致性,存在短暂的数据不一致;需为每个本地事务编写补偿逻辑,开发成本较高;补偿事务的执行可能失败,需设计重试机制和异常处理方案。

4.4.4 适用场景

适用于业务流程长、步骤多、对一致性实时性要求不高的分布式场景,如电商订单履约、供应链管理、物流跟踪等长事务场景,尤其适合无法使用TCC模式的复杂业务流程。

4.5 本地消息表(Local Message Table)—— 最终一致性方案

4.5.1 核心原理

本地消息表方案将分布式事务拆解为多个本地事务,通过消息队列(MQ)异步协调,核心思路是“将业务操作与消息发送封装为本地事务”,确保业务执行成功后消息必然被持久化,再通过异步任务将消息投递到目标服务,实现最终一致性,避免同步阻塞,适用于高吞吐场景。

4.5.2 执行流程(以订单-库存为例)

  1. 订单服务在本地事务中,同时执行“创建订单”和“插入本地消息表(状态:未同步)”两个操作,确保两个操作要么同时成功,要么同时失败(依托本地事务保障)。
  2. 启动定时任务,轮询本地消息表中“未同步”的消息,将消息发送到消息队列(MQ),若发送失败则重试(确保消息必达)。
  3. 库存服务消费MQ消息,执行“扣减库存”操作,消费时需保证幂等性(如通过消息唯一ID避免重复消费)。
  4. 库存服务消费成功后,调用RPC接口更新订单服务的本地消息表,将消息状态改为“已完成”(或直接删除消息);若消费失败,不处理,等待MQ重试,多次失败可触发人工干预。

4.5.3 优缺点

  • 优点:实现简单,无侵入性(无需引入额外分布式事务框架);依赖关系弱,各服务独立运行;性能高,采用异步通信,无同步阻塞;成本低,依托本地数据库和消息队列即可实现。
  • 缺点:需额外维护本地消息表,增加数据库操作压力;一致性延迟取决于定时任务的轮询间隔,实时性较差;需手动处理消息重试、幂等性问题,后期维护成本较高。

4.5.4 适用场景

适用于中小规模分布式系统、对一致性实时性要求不高、高吞吐的场景,如电商订单状态同步、积分发放、消息通知等非核心业务场景,不适用于核心交易场景(如支付)。

4.6 分布式事务框架Seata—— 一站式解决方案

4.6.1 核心简介

Seata(Simple Extensible Autonomous Transaction Architecture)是阿里巴巴开源的分布式事务框架,整合了多种分布式事务模式,将全局事务拆分为多个分支事务,由全局事务协调分支事务的两阶段提交,简化了分布式事务的开发,支持AT、TCC、SAGA、XA四种模式,适配不同业务场景,是目前生产环境中最常用的分布式事务解决方案之一。

4.6.2 核心角色(Seata专属定义)

  • TC(Transaction Coordinator,事务协调器):独立部署的组件,负责维护全局事务的状态,协调所有分支事务的提交与回滚,是Seata的核心协调节点。
  • TM(Transaction Manager,事务管理器):部署在应用程序中,负责发起全局事务(通过@GlobalTransactional注解标记事务边界),向TC注册全局事务,触发全局提交或回滚。
  • RM(Resource Manager,资源管理器):部署在各服务节点,负责管理本地资源,向TC注册分支事务,执行本地事务操作,并接收TC的提交/回滚指令,通过undo_log表实现自动补偿(AT模式)。

4.6.3 核心模式(重点讲解常用模式)

  • AT模式(自动补偿模式):Seata的默认模式,基于2PC改进,零代码侵入,无需手动编写补偿逻辑。核心原理是:一阶段执行本地事务,记录undo_log(数据快照);二阶段提交时,异步删除undo_log;二阶段回滚时,根据undo_log生成反向SQL,恢复数据。适用于对代码侵入性要求低、中小规模项目,支持大部分SQL语法(INSERT/UPDATE/DELETE),依赖数据库本地事务。
  • TCC模式:与原生TCC一致,Seata提供框架支持,简化幂等性、空回滚、悬挂等问题的处理,需手动编写Try、Confirm、Cancel方法,适用于金融交易等高一致性要求的场景。
  • SAGA模式:Seata提供编排式SAGA实现,通过状态机配置管理事务流程,支持长事务和异步场景,适用于电商订单履约等长流程业务。

4.6.4 优缺点

  • 优点:一站式解决方案,支持多种事务模式,适配不同场景;AT模式零代码侵入,降低开发成本;性能优于传统2PC,支持高并发;社区活跃,文档完善,易于集成(支持Spring Cloud、Dubbo等框架);支持分库分表场景(结合ShardingSphere)。
  • 缺点:需额外部署Seata Server(TC),增加系统部署复杂度;AT模式依赖数据库事务,仅支持MySQL、Oracle等主流关系型数据库;全局锁可能成为高并发场景的性能瓶颈。

4.6.5 适用场景

适用于各类分布式系统,尤其是微服务架构,如电商、金融、物流等行业,可根据业务场景选择对应的模式(核心交易场景用AT/TCC,长事务场景用SAGA),是目前生产环境中首选的分布式事务解决方案。

五、主流解决方案对比与选型建议

5.1 核心方案对比

2PC

强一致性

低并发、强一致性优先(金融转账)

3PC

强一致性

强一致性+一定可用性,实际应用少

TCC

最终一致性

高并发、复杂业务(电商支付)

SAGA

最终一致性

长事务、多步骤流程(订单履约)

本地消息表

最终一致性

中小规模、低实时性(积分发放)

Seata

强/最终一致性

中高

低-中

低-中

各类微服务场景(首选)

5.2 选型核心建议

  • 优先选Seata:大部分微服务场景,优先使用Seata框架,根据业务场景选择模式(核心交易用AT/TCC,长事务用SAGA),兼顾开发效率和性能。
  • 强一致性优先:金融转账、银行对账等核心场景,若不使用Seata,可选择2PC(简单场景),但需接受性能损耗;高并发强一致性场景,选择Seata TCC模式。
  • 高可用、高并发优先:电商订单、物流等场景,选择Seata AT/SAGA模式,或原生TCC模式,牺牲严格一致性,保证系统可用性和性能。
  • 中小规模、低成本:非核心业务(如消息通知、积分发放),可选择本地消息表,无需额外部署框架,降低成本。

六、分布式事务常见问题与避坑技巧

6.1 常见问题

  • 幂等性问题:分布式环境中,消息重试、接口重试可能导致重复执行,需保证事务操作的幂等性(如通过唯一ID、版本号、状态机控制)。
  • 空回滚问题:TCC模式中,某RM未执行Try操作,却收到Cancel指令,导致空回滚,需记录分支事务状态,避免空回滚。
  • 悬挂问题:TCC模式中,Cancel操作执行后,Try操作才到达,导致资源被释放后又被锁定,需通过事务状态控制,避免悬挂。
  • 消息丢失/重复消费:本地消息表、SAGA模式中,消息队列的消息可能丢失或重复消费,需通过消息持久化、重试机制、幂等性设计解决。
  • 锁竞争问题:2PC、Seata AT模式中,全局锁可能导致锁竞争,影响性能,需优化锁粒度、设置合理的锁超时时间。

6.2 避坑技巧

  • 尽量避免分布式事务:能通过业务设计规避的,优先规避(如将跨服务操作拆分为单服务操作,通过消息异步同步数据)。
  • 优先选择成熟框架:生产环境中,优先使用Seata等成熟框架,避免手动实现分布式事务(减少开发成本和bug)。
  • 设计幂等性接口:所有分布式事务相关的接口,必须实现幂等性,避免重复执行导致数据异常。
  • 合理设置超时时间:针对不同方案,设置合理的超时时间(如2PC的准备阶段超时、Seata的全局锁超时),避免资源长期阻塞。
  • 做好监控与日志:记录分布式事务的执行状态、异常信息,便于问题排查;监控事务执行耗时、失败率,及时发现性能瓶颈。

七、总结

分布式事务的核心是解决“分布式环境的不可靠性”与“数据一致性”的矛盾,其本质是在一致性、可用性、性能之间做权衡。目前没有完美的分布式事务解决方案,需根据业务场景(一致性要求、并发量、成本)选择合适的方案:强一致性场景优先考虑2PC、Seata TCC;高可用、高并发场景优先考虑Seata AT/SAGA、TCC;中小规模、低成本场景可选择本地消息表。

在实际开发中,优先通过业务设计规避分布式事务,若无法规避,建议使用Seata框架简化开发,同时做好幂等性、超时控制、监控日志等配套设计,确保分布式事务的稳定运行,避免因数据不一致导致的业务异常。

ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花

MySQL基础 文章被收录于专栏

《MySQL基础专栏》专为编程新手打造!从SQL核心语法、数据增删改查,到预编译SQL、索引入门、事务基础,层层拆解MySQL必备知识点。专栏摒弃晦涩术语,以通俗讲解+实操案例,带你掌握数据库基础操作,规避SQL注入、性能低效等常见坑,快速搭建MySQL基础体系,轻松应对日常开发中的数据库基础场景。

全部评论

相关推荐

一面 情况:通过面经:百度后台开发实习一面 - 大概40min1. 自我介绍2. 大二实习的话时间能兼顾吗3. 常见数据结构了解过吗 说一下栈和队列的区别4. 用Golang手撕一个二分查找在数组中找到目标值(第一次手撕遇到这个内心暗暗自喜觉得面试官不为难我太好了)5. Go语言学了多久6. HTTP和HTTPS的区别7. 你说你项目里面用到了gRPC 说一下RPC和HTTP的区别8. 从浏览器输入一个网址到渲染页面出来的全过程背后是怎么样的9. 接口请求是怎么打到一个后端服务的(我重点答了打到服务器之后会根据端口去区分)10. MySQL的索引是什么11. 实际开发过程中用过什么索引 讲一下12. 项目中是怎么用Redis的 用了哪些数据类型 说一下13. MySQL聚簇索引和非聚簇索引的区别14. 进程 线程 协程有什么区别15. 你对项目部署了解多少 Docker这些有用过吗16. 平时开发用的是windows系统还是linux17. 熟悉linux基本命令吗 比如查看一个文件的最后几行内容用什么命令知道吗18. 写完二分查找之后又问了我一个微信红包的场景题 怎么保证微信红包的金额尽可能随机然后每个人抢到的概率随机 怎么去设计(这个场景题我没怎么接触过 答的不是很好)19. 常见设计模式了解过吗二面情况:通过面经:百度后台开发实习二面 - 大概35min1. 自我介绍2. 你项目中用到的SingleFlight合并请求解决缓存穿透是怎么用的 说一下3. 有没有看过SingleFlight的底层实现原理?说一下4. 如果让你用Go来实现这个 你会怎么做 说一下思路5. 你提到了channel 你知道channel的底层实现原理吗 有缓冲的channel和无缓冲的channel有什么区别?6. 项目中有没有遇到什么难点?7. 说一下你的MySQL和ES的一致性是怎么做的?8. 你说到用到了Kafka去消费消息 那你怎么保证最终同步过去后MySQL和ES同步成功(我一直在答Kafka消费失败的重试机制 死信队列那些 然后面试官说他想问的是怎么确定MySQL和ES同步成功了 我说可以考虑设计一个后台脚本来定期读取MySQL和ES 然后判断是否一致)9. 手撕题目:给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。示例 1:输入:s = "1 + 1"输出:2示例 2:输入:s = " 2-1 + 2 "输出:3示例 3:输入:s = "(1+(4+5+2)-3)+(6+8)"输出:23提示:1 <= s.length <= 3 * 105s 由数字、'+'、'-'、'('、')'、和 ' ' 组成s 表示一个有效的表达式'+' 不能用作一元运算(例如, "+1" 和 "+(2 + 3)" 无效)'-' 可以用作一元运算(即 "-1" 和 "-(2 + 3)" 是有效的)输入中不存在两个连续的操作符每个数字和运行的计算将适合于一个有符号的 32位 整数后来才知道原来这个是Hot150题库上的一道 Hard 224. 基本计算器 之前没刷过 还是自己准备不足(我一开始一直想用双栈法去做 一个栈存数字一个栈存运算符 但是当时可能是看到这道题是Hot100之外的 并且面试官一直看着我有点紧张所以就有一些细节一直没写对 最后面试官告诉我想复杂了 可以更简单一点)10. 最近在学习什么后端的方向11. 有用过Linux吗 平时开发用的是Windows还是linux觉得自己二面表现得很差 应该是要挂掉我了 没想到隔天HR打电话告诉我一二面都过了 但是因为只剩下一个hc了 想要更充分了解候选人所以再约一个三面 然后这个时候官网进度那里面试环节已经是打勾了三面情况:三面后刷新官网已挂三面没有问任何技术相关的 15分钟就结束了(面试官说一二面已经问过技术了我就不问了 心里瞬间就放松了 而且三面那天还发烧了) 单纯聊天 问我一些职业规划 还有一些个人情况什么的 然后面试官还问我为什么大二就出来实习 身边大二出来实习的多不多 未来规划是什么 我说我对技术很热爱 想学到企业开发的技术锻炼更多实战经验 然后他还问我你们学校是不是就在旁边 我说我骑个车三四分钟就到了哈哈哈(其实我经常去百度大厦下面吃麦当劳) 还问了我一些职场中的问题比如给你十个任务 每个任务优先级不一样 Deadline也不一样 如果是你的话你要怎么去在有限的时间内完成这些任务  感觉是HR面不是技术面 最后还问了我多大 聊天还挺愉快的最后自己觉得应该是被横向评估挂掉了 不过还是很感谢百度给了我人生中第一次面试的机会 遇到的面试官都都挺不错的 虽然面到了三面后把我挂了还是有点浇冷水的失落感 甚至三面之前官网进度那里面试那个选项就已经是打勾了的 然后三面完突然变成灰色了 诶 继续沉淀吧
Andrew1219:
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务