面试题答案
一键面试AT模式工作原理
- 一阶段:
- 数据操作与快照:业务模块执行SQL时,Seata的代理数据源会拦截SQL。对于UPDATE操作,会在执行前记录数据的旧值(before image),执行后记录新值(after image)。INSERT和DELETE操作也类似,会记录相关数据镜像。
- UndoLog生成:这些数据镜像会被写入到UndoLog中,同时业务SQL在本地数据库执行,本地事务提交。
- 全局事务登记:向TC(Transaction Coordinator)注册分支事务,报告事务的执行状态。
- 二阶段 - 提交:
- TC收到全局事务提交请求,会向各分支事务发送提交请求。
- 分支事务收到提交请求后,直接删除UndoLog,完成分支事务提交。因为一阶段本地事务已提交,这里无需再操作业务数据。
- 二阶段 - 回滚:
- TC收到全局事务回滚请求,向各分支事务发送回滚请求。
- 分支事务根据UndoLog中的数据镜像,反向执行SQL,恢复数据到修改前的状态,完成回滚。
TCC模式工作原理
- Try阶段:
- 对业务资源进行初步的预留操作,这个阶段主要完成业务检查和资源预留。例如,在扣减库存场景中,Try阶段可以检查库存是否足够,并冻结相应的库存数量。
- Try操作完成后,向TC报告执行状态。
- Confirm阶段:
- 当全局事务决定提交时,TC向各分支事务发送Confirm请求。
- 分支事务在Confirm阶段完成真正的业务操作,例如扣减在Try阶段冻结的库存。Confirm操作要求幂等,即多次执行结果相同。
- Cancel阶段:
- 当全局事务决定回滚时,TC向各分支事务发送Cancel请求。
- 分支事务在Cancel阶段释放Try阶段预留的业务资源,例如解冻Try阶段冻结的库存。Cancel操作同样要求幂等。
优先选择TCC模式而非AT模式的业务场景
- 高性能场景:
- 场景描述:在高并发的电商秒杀场景中,系统需要处理大量的订单扣减库存、扣减余额等操作。对性能要求极高,需要尽量减少数据库锁的持有时间。
- 选择原因:AT模式下,一阶段会持有数据库锁直到本地事务提交,在高并发场景下可能导致锁竞争严重,性能下降。而TCC模式在Try阶段可以快速完成资源预留,释放数据库锁,后续Confirm和Cancel操作也不依赖数据库锁,能大大提高系统并发性能。
- 业务定制化场景:
- 场景描述:在复杂的金融业务流程中,例如涉及多方资金清算,不同的业务参与方可能有不同的业务逻辑和数据处理方式,需要高度定制化的事务处理流程。
- 选择原因:AT模式依赖数据库的支持和固定的UndoLog机制,灵活性相对较差。TCC模式允许开发者根据业务需求自定义Try、Confirm和Cancel逻辑,更能满足这种高度定制化的业务场景。