什么是最佳事务隔离级别可用于此方案?

时间:2017-08-08 01:02:57

标签: postgresql transactions

我对数据库非常陌生,我也是postgres的新手。 想象一下,我正在构建一个允许用户编辑和更新它们的仪表板应用程序。由于许多用户可以编辑/更新单个仪表板,我想确保它们与事务一起工作,但同时也能很好地扩展。 我已经阅读了几天的文档,我带来了我最初的计划:

1.Begin事务和更新语句postgres将获取该行的锁定(锁定在我们提交/回滚之前可见),以便其他用户必须等待。但这并没有解决我的问题。

  1. 或者使用Repeatable Read启动事务,这意味着每个用户都将相应地获取数据的快照,因此他们可以使用他们的副本并根据需要更新它们。但是,我想知道这是否会因为我没想到的几个条件而破裂? 还有其他办法来处理吗?
  2. 想象一下,该应用程序类似于谷歌电子表格。

2 个答案:

答案 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。