乐观并发控制在写入或提交时检查读取后是否发生冲突,适合希望避免长时间预先持锁的工作流程。
版本检查
可以给记录保存 version,更新时同时带上原版本条件,并原子增加版本:
UPDATE inventory
SET quantity = quantity - 1, version = version + 1
WHERE id = :id AND version = :old_version AND quantity > 0;
这是说明原理的参数化 SQL,具体占位符取决于驱动。应用必须检查影响行数;零行可能表示版本变化、库存不足或记录不存在,应按业务区分,不能当作成功。
冲突处理
冲突后可以重新读取并重算、向用户提示或有限重试。不能无条件用旧数据覆盖,也不能无限重试。乐观控制仍依赖数据库原子写入,不等于完全没有底层锁。