面试题答案
一键面试影响体现
- 事务原子性破坏:原本一个大事务的操作被拆分成多个小事务,若其中某个小事务失败,已成功的小事务可能无法回滚到初始状态,导致部分数据更新而部分未更新,破坏了原子性。
- 隔离性降低:拆分事务后,不同小事务可能并行执行,增加了数据并发访问的可能性,容易出现脏读、不可重复读、幻读等问题,降低了事务的隔离性。
- 一致性维护难度增加:由于事务被拆分,原本在一个事务内保证的一致性,现在需要协调多个小事务之间的关系来维护,增加了一致性维护的复杂度。
应对策略
- 保证最终一致性
- 使用消息队列:将小事务执行结果通过消息队列异步通知相关模块,确保数据的最终一致性。例如,订单系统拆分事务后,支付成功的消息发送到消息队列,库存系统消费消息后更新库存。
- 引入补偿机制:针对失败的小事务,设计相应的补偿操作,对已成功的小事务进行反向操作,恢复数据到初始状态。如订单创建成功但库存扣减失败,通过补偿操作回滚订单。
- 定期数据校验与修复:定期对关键数据进行一致性检查,发现不一致数据及时修复。例如,每晚对订单和库存数据进行比对,修复差异数据。
- 权衡性能与一致性
- 读操作优化:对于一致性要求不高的读操作,可以使用缓存(如Redis),减少对数据库的直接读取,提高性能。例如,商品列表等数据可从缓存读取。
- 写操作优化:在保证一致性的前提下,尽量减少锁的粒度和持有时间。采用行锁而非表锁,缩短事务执行时间。如更新订单状态时,只锁定订单行数据。
- 根据业务场景选择策略:对于金融等对一致性要求极高的业务,优先保证一致性;对于一些允许短暂不一致的业务(如社交平台的点赞数统计),可适当牺牲一致性换取性能。