面试题答案
一键面试常见的分布式事务场景
- 订单 - 库存场景:用户下单时,订单服务创建订单记录,库存服务扣减库存。若库存扣减失败,订单需回滚,保证数据一致性。
- 支付 - 订单场景:支付成功后,支付服务通知订单服务修改订单状态为已支付。若支付成功但订单状态未更新,需回滚支付操作。
- 跨库操作场景:不同数据库间的数据交互,如一个业务操作涉及到用户库和订单库的修改,需要保证两个库的数据一致性。
Seata框架AT模式处理分布式事务的原理
- 全局事务与分支事务:Seata把一个分布式事务理解成一个包含了若干分支事务的全局事务。全局事务的职责是协调其下管辖的分支事务达成一致,要么一起成功提交,要么一起失败回滚。
- 数据快照:在每个分支事务执行前,Seata会对数据进行快照(undo_log)。执行完成后,再生成一份数据快照(redo_log)。如果事务需要回滚,就可以根据undo_log恢复数据到事务执行前的状态。
- 两阶段提交:
- 第一阶段:各分支事务执行,并将undo_log和redo_log记录下来,但不提交事务。此时数据库资源被锁定。
- 第二阶段:如果全局事务提交,各分支事务直接提交;如果全局事务回滚,根据undo_log进行回滚操作,释放数据库资源。
Seata框架AT模式处理分布式事务的实现步骤
- 引入依赖:在各个微服务的pom.xml文件中引入Seata相关依赖。
- 配置Seata Server:配置Seata Server的地址等信息,可通过application.yml文件配置。
- 开启全局事务:在发起分布式事务的业务方法上使用
@GlobalTransactional
注解。 - 编写业务逻辑:各个微服务按照正常业务逻辑编写,Seata会自动处理分支事务的注册、提交和回滚。
- 数据准备:确保数据库支持本地事务,并创建好undo_log表,用于记录数据快照。