# 两个人同时改库存会发生什么

By DUSK

Topic: Computing, AI &amp; Electronics

[Open the interactive Jig](https://ask.jig.com/j/f1dIY5vU4OLj)

## Guide

### 1. 一个抽屉，两张工作台

抽屉里有 2 件货，柜顶的卡片是库存记录，写着 2。左边的店员 A 和右边的店员 B 同时各卖出 1 件。都卖完后，记录应该变成 0。

这是示意模型和教学小例子，不是真实的数据库引擎；动作被放慢演示。

### 2. 先读，再算

改库存分三步：读出记录，在自己的草稿板上减 1，再写回去，叫作“读\-改\-写”。A 和 B 几乎同时读到了 2，各自算出 2 − 1 = 1。

草稿板上的数字是每个人的本地副本，别人看不见。

### 3. 后写的盖掉了先写的

A 把 1 写回记录，拿走一件货。B 的副本还是旧的 2，算出来也是 1，于是又写了一次 1。两件货都卖了，记录却只少了 1，这叫“丢失更新”。

抽屉已经空了，记录却说还剩 1 件。

### 4. 加一把行锁

新规定：要改这条记录，先拿到它的锁。A 先拿到锁，读到 2。B 也想读取并修改，只能等 A 用完。等待不是出错，只是排队。

“行”指数据表里的一条记录，这里就是这张库存卡。

### 5. 排队之后，结果是 0

A 写入 1 并提交，锁随之释放。B 这才拿到锁，读到最新的 1，算出 0 再写回。两次更新都算数了。

行锁只保护被锁住的这一行，并不能消除所有并发问题。

### 6. 自己排一排

先选“不加锁”或“行锁”，再按“下一拍”一步步推进，按“重置”从头再来。留意读、写和等待的先后顺序。

一句话：读和写之间留有空隙就会丢更新，行锁让修改排队，库存才正确减到 0。
