我对数据库非常陌生,我也是postgres的新手。 想象一下,我正在构建一个允许用户编辑和更新它们的仪表板应用程序。由于许多用户可以编辑/更新单个仪表板,我想确保它们与事务一起工作,但同时也能很好地扩展。 我已经阅读了几天的文档,我带来了我最初的计划:
1.Begin事务和更新语句postgres将获取该行的锁定(锁定在我们提交/回滚之前可见),以便其他用户必须等待。但这并没有解决我的问题。
想象一下,该应用程序类似于谷歌电子表格。
答案 0 :(得分:1)
为了这个目的,我建议乐观锁定:
当您从表中SELECT
行时,请记住其所有值。
当您UPDATE
行时,添加一个WHERE
子句,检查值是否保持不变。
如果没有更新行,请告诉用户操作失败,因为有并发修改。
你会坚持使用默认的READ COMMITTED
隔离级别。
答案 1 :(得分:1)
请参阅我之前在隔离级别上准备的这些说明:
https://github.com/dmgerman/csc370/blob/master/notes/ch_18_transactions_2.pdf
大多数教科书都是关于隔离级别的理论,并且从实际角度来解释它。我的笔记基于postgres并且不仅解释了隔离,而且还解释了当查询由于其隔离级别而能够阻止另一个查询时。 这些注释还给出了每个隔离级别可能失败的情况的示例。
通常,Read Committed足以满足大多数工作需求。 Read committed只会产生暂时不正确的结果(例如,聚合可能会考虑此时正在删除的值)。
此外,postgres未实现Read Uncommitted。