面试题答案
一键面试1. 业务场景举例
- 电商订单系统:
- 在高并发下单场景下,当用户提交订单时,需要原子性地完成库存扣减和订单创建两个操作。若要保证原子性,使用传统数据库事务,在高并发时会导致大量锁争用。例如,多个用户同时抢购同一商品,每个订单操作都要对库存数据加锁。这与一致性、隔离性和持久性之间会产生冲突。从一致性角度看,若为了保证原子性而长时间持有锁,会导致其他用户等待,影响系统整体数据一致性的实时性;从隔离性角度,强隔离级别下的锁机制会降低并发性能;从持久性角度,为保证原子性的强事务处理可能会因长时间占用资源而影响持久化效率。
- 银行转账系统:
- 当进行跨行转账时,需要原子性地在转出账户扣钱和在转入账户加钱。在高并发情况下,假设每个转账操作都要保证严格原子性,使用全局事务锁。例如,同一时间大量用户进行跨行转账,锁的争用会非常严重。这与一致性冲突在于,等待锁的过程中,系统的实时一致性受到影响;与隔离性冲突在于,高并发下强隔离级别事务处理会限制并发;与持久性冲突在于,长时间占用资源可能延迟持久化操作。
2. 设计系统时的取舍和优化
- 引入分布式事务框架:
- 例如使用Seata,采用AT模式。它通过对数据的快照来实现原子性,同时在一定程度上降低锁的粒度和持有时间。在电商订单场景中,Seata AT模式下,对库存和订单表的操作在各自本地事务中执行,只在提交阶段通过全局事务协调器保证原子性,减少了锁争用,提高并发性能,又能保证数据的最终一致性。
- 采用柔性事务:
- 以TCC(Try - Confirm - Cancel)模式为例。在银行转账场景中,Try阶段冻结转出账户金额,Confirm阶段完成实际转账,Cancel阶段解冻金额。这种方式将原子性操作进行拆分,在高并发时可以并行处理部分操作,提高并发性能。虽然在事务执行过程中数据处于中间状态,牺牲了一定的强一致性,但通过最终的确认和补偿机制,能保证数据的最终正确性。
- 优化数据结构和存储:
- 对于电商库存,可以采用分布式缓存(如Redis)进行库存的预扣减。在高并发下单时,先在Redis中原子性地扣减库存,再异步同步到数据库。这样既保证了下单操作的原子性(在缓存层面),又提高了并发性能。在数据库层面,可以通过分库分表减少锁争用范围,提高系统整体并发处理能力,同时通过合适的缓存策略和数据同步机制保证数据一致性。