Skip to content
阅读进度

如何理解MVCC、事务隔离与并发不变量? ​

返回 架构与 SDK 目录

标准回答 ​

MVCC 让事务按规则观察数据版本,减少部分读写互相阻塞,但不会自动消除全部业务竞态。PostgreSQL 默认 Read Committed 下,不同语句可以看到不同已提交状态;读到合法余额后再写入,并不自动保证并发余额约束。

业务不变量优先通过唯一约束、检查约束、条件更新和必要锁在数据库内表达。多行条件可能需要更强隔离或明确锁定;Serializable 仍可能以冲突失败要求重试,并不是让所有事务无条件成功。

锁保持时间应尽量短,长模型调用和远程网络不宜放在数据库事务内。出现死锁时,数据库会终止其中事务,应用需要识别并受控重试;统一锁顺序和缩短范围可以降低概率,但不是绝对免疫。

追问与回答 ​

乐观锁适合什么场景 ​

冲突较少、可以重试的更新可使用版本条件更新,并检查受影响行数;冲突频繁时需要重新考虑粒度和串行化。

为什么事务提交成功还不能保证外部任务完成 ​

数据库事务只覆盖参与其中的数据,模型、消息和第三方副作用需要 Outbox、幂等或补偿协议连接。

易混淆点 ​

  • 以使用事务为由省略业务唯一约束。

参考资料 ​

内容来源 ​

用完整回答理解机制,用真实证据解释项目。