Python 现代开发学习笔记

(十一)两份快照造成的更新丢失

完整文件替换解决了半份写入,但两个调用者仍可能各自拿着旧数据修改:

# 两个读者先后读到同一旧内容,再各自完整替换目标文件。
import json
from pathlib import Path

path = Path("shared.json")
path.write_text('["Python"]', encoding="utf-8")
first = json.loads(path.read_text(encoding="utf-8"))
second = json.loads(path.read_text(encoding="utf-8"))
first.append("NumPy")
second.append("Pygame")
for name, records in [("first.tmp", first), ("second.tmp", second)]:
    temporary = Path(name)
    temporary.write_text(json.dumps(records), encoding="utf-8")
    temporary.replace(path)
print(json.loads(path.read_text(encoding="utf-8")))

输出 ['Python', 'Pygame']。第一次保存加入了 NumPy;第二个读者却仍基于没有 NumPy 的旧快照,完整替换后把第一次更新一起覆盖了。

两个读者从同一快照修改,后写入者覆盖先前更新

需要围绕整段“读取、检查、修改、保存”协调并发,或者把修改交给数据库中的事务与具体语句。例如累计分钟数可以让数据库执行 minutes = minutes + ?,而不是先读到 Python、加一、再用旧值覆盖。文件、事务和查询各解决哪一部分问题,要沿实际的读写顺序区分。

笔记正文与全部题解 · Ctrl / ⌘ K