面试题答案
一键面试1. 事务隔离性
- 关键要点:在高并发环境下,不同事务的补偿操作可能同时进行,若隔离性处理不当,会导致数据不一致。例如,一个事务的补偿操作读取到另一个未完成事务修改的数据,从而产生错误的补偿结果。
- 解决方案:采用合适的并发控制机制,如乐观锁或悲观锁。乐观锁在更新数据时检查数据版本,只有版本一致才执行更新,适合读多写少场景;悲观锁在操作数据前就锁定数据,防止其他事务并发修改,适用于写多读少场景。例如在数据库层面,使用
SELECT... FOR UPDATE
语句实现悲观锁,确保在补偿操作期间相关数据不会被其他事务修改。
2. 网络可靠性
- 关键要点:网络不稳定可能导致补偿请求丢失、重复或延迟,使得补偿操作无法准确、及时执行。比如补偿请求在传输过程中因网络故障丢失,系统误以为补偿未执行而重复发起,造成补偿过度。
- 解决方案:引入可靠的消息队列(MQ),如 Kafka 或 RabbitMQ。将补偿操作封装成消息发送到 MQ,MQ 保证消息的可靠投递,即使网络暂时中断,消息也不会丢失。同时,在接收端实现幂等性处理,通过记录已处理的消息 ID 等方式,避免重复执行相同的补偿操作。例如,在处理补偿消息时,先检查消息 ID 是否已在本地记录中存在,若存在则直接忽略,确保相同补偿操作只执行一次。
3. 状态管理
- 关键要点:准确跟踪每个事务及其补偿操作的状态至关重要。若状态记录不准确,可能导致补偿操作在错误的状态下执行,或者错过必要的补偿时机。例如,事务已经成功提交,但由于状态更新不及时,系统仍尝试进行补偿。
- 解决方案:设计一个状态机来管理事务和补偿操作的状态。每个事务和补偿操作都有明确的状态转换规则,如“初始”“执行中”“成功”“失败”等。状态的更新要与实际操作紧密关联,并且采用持久化存储(如数据库)记录状态,确保系统故障后状态可恢复。在进行补偿操作前,先检查事务当前状态,只有在符合补偿条件的状态下才执行补偿。
4. 补偿操作的幂等性
- 关键要点:幂等性确保无论补偿操作执行多少次,对系统状态的影响都是一致的。在高并发和网络不稳定时,重复的补偿请求可能会被发送,若补偿操作不具备幂等性,会导致数据不一致或补偿过度。
- 解决方案:在设计补偿操作时,使操作具备幂等性。例如,对于增加库存的补偿操作,可以通过数据库的唯一约束或在代码中先查询再操作的方式实现幂等。若库存增加操作基于订单 ID,可在数据库中对订单 ID 增加唯一索引,多次执行增加库存操作时,数据库会自动忽略重复的插入请求,保证库存增加的准确性。
5. 故障恢复
- 关键要点:当系统发生故障(如服务器宕机)时,要能够正确恢复并继续执行未完成的补偿操作,避免数据不一致。如果故障恢复过程处理不当,可能导致部分补偿操作遗漏或重复执行。
- 解决方案:定期对事务和补偿操作的状态进行持久化检查点(Checkpoint),记录系统当前状态。当系统故障恢复后,从最后一个检查点开始,重新加载未完成的事务和补偿操作,并按照状态机规则继续执行。同时,结合日志记录所有的操作步骤,便于故障排查和恢复过程的审计。例如,使用数据库的日志机制记录每次补偿操作的详细信息,在恢复时根据日志和检查点信息,准确判断哪些补偿操作需要重新执行。