原子性Atomicity
你可能会说
两个用户同时抢最后一件时,不能出现两张成功订单;检查和扣库存要作为一个整体。
一组相关操作要么整体生效,要么整体不生效,中间结果不能被当成最终结果。例如最后一件商品同时被两个请求购买时,检查库存和扣减库存必须作为一个不可分割的整体,让一个请求成功、另一个明确失败。原子性只保证划定范围内的整体结果,并不代表所有跨系统步骤都能一起回滚。
也常被叫作原子
延伸阅读 · 权威出处
两个用户同时抢最后一件时,不能出现两张成功订单;检查和扣库存要作为一个整体。
拆开的读和写留下了可被竞争的中间状态。
问题与关键机制:两个请求同时读取最后一件库存时,分开的读取和扣减可能让两边都认为能成功;把检查和扣减作为一个不可分割的操作,只有仍满足条件的请求完成扣减,另一请求整体失败。
怎样观察改善:另一个请求应当明确失败并收到库存不足提示,不能产生第二张成功订单。最后核对库存、成功订单数和失败反馈是否彼此一致。
领取客服工单也需要原子性:两名客服同时领取同一工单时,检查“未领取”和写入负责人必须是一个原子操作;只能一人成功,另一人收到已被领取。
请检查抢购流程:在库存为 1 时模拟两个请求同时到达,确保检查库存和扣减库存是一个不可分割的数据库操作。验收确认只能产生一个成功订单且库存变为 0,另一个请求收到库存不足;不要把前端禁用按钮当成并发保护。