乐于分享
好东西不私藏

真题再现(2020年软件设计师真题)

真题再现(2020年软件设计师真题)

在某电商平台的库存管理系统中,多用户同时抢购某款限量商品时,可能出现“超卖”现象(实际库存10件,却卖出15件)。该问题的本质是事务并发时产生了(),可通过提高事务隔离级别解决。A. 脏读B. 不可重复读C. 幻读D. 丢失更新

考点解析

本题核心考查事务并发时的四大问题及隔离级别:

1.脏读:一个事务读取到另一个未提交事务的修改数据(如A改了库存未提交,B读到该数据后A又回滚)。
2.不可重复读:同一事务内两次读取同一数据,结果不同(如A读库存后,B修改并提交,A再读时数据变了)。
3.幻读:同一事务内,按相同条件查询,结果集行数不同(如A查库存≥10的商品,B新增了符合条件的商品,A再查时多了记录)。
4.丢失更新:两个事务同时修改同一数据,后提交的事务覆盖了先提交的修改(如A、B同时读库存10,A减3,B减5,最终库存成5而非2)。

详细分析过程

题干中“超卖”是因多用户同时修改库存,后提交的操作覆盖了先提交的结果(如两人同时看到库存10,分别买5件,最终库存应为0,却因覆盖成5),属于丢失更新:

选项A:脏读是读未提交数据,与超卖无关,排除。
选项B:不可重复读是同一事务内数据变化,不涉及多事务覆盖,排除。
选项C:幻读是结果集行数变化,与库存数值修改无关,排除。
选项D:丢失更新符合多用户同时修改库存导致的超卖场景,正确。

工作中的实际应用

早年做秒杀系统时,就因没处理丢失更新,出现过“100件商品卖出200件”的事故。当时两个用户同时下单,都读到库存100,各自扣减后提交,最终库存变成99(本该是98)。

后来通过提高隔离级别到“可重复读”,并加行锁解决:用户下单时,数据库会锁定库存记录,其他用户需等待前一个事务完成才能读取,避免了同时修改。但隔离级别太高也有问题,曾因锁等待导致系统响应变慢,最后调整为“读已提交”+ 乐观锁(版本号控制),既减少了锁冲突,又防止了超卖。

答案总结

多事务并发修改同一数据时,丢失更新是常见问题,需通过合适的隔离级别或锁机制解决。

答案:D