【问题标题】:Stop users overwriting each other阻止用户互相覆盖
【发布时间】:2011-01-19 14:04:32
【问题描述】:

我想阻止两个用户在更新记录时意外地相互覆盖。也就是说,两个用户加载了一个带有记录 A 的页面。用户一将记录更新到 AB,用户二将记录更新到 AC。

我不只是希望最后一个命中数据库来覆盖。我需要一种机制来说明记录已更新,因此您的记录无法保存。

现在我的两个想法是给记录加时间戳并检查它。如果不匹配,则不允许更新。第二种方法是每次执行更新时对记录进行 GUID,检查 GUID,如果不匹配则不更新。

这些方法是否有效,如果有效,最好。如果没有,你有什么建议。如果它有所作为,这是在 C# 中

谢谢

【问题讨论】:

  • 你有什么样的“数据库”?好的数据库系统通常都实现了锁定。

标签: c# database overwrite


【解决方案1】:

您提到的两种方法实际上是等效的 - 无论哪种方式,您都有效地获得了“结帐时记录”的唯一标识符。我对哪个更好没有任何特别的看法,尽管时间戳显然为您提供了有关记录何时有效的数据的额外好处

另一种方法是记住以前的值是什么,并且仅在它们匹配时才允许更新 - 这样,如果用户 A 开始编辑记录,然后用户 B 进入并更改某些内容,然后将其更改回来,用户 A 的编辑仍然有效。

这些技术的术语是乐观锁定(或optimistic concurrency control)。

【讨论】:

  • 我真的很愚蠢,因为我以前从来没有处理过这个问题。准备阅读“24 小时内的 c#”,看看我还错过了什么。
【解决方案2】:

其实还有第三种方法。要进行更新,请发出以下形式的更新声明:

UPDATE table SET update_field = new_value
WHERE db_pk = my_pk       // assume primary key immutable
AND update_field = original_field_value

其中 original_field_value 是尝试更新之前的字段值。如果其他人修改了 update_field,此更新将失败,除非他们已将其更改为与您相同的值。

【讨论】:

    【解决方案3】:

    您正在描述乐观锁定,这是一种有效且有用的技术。

    references here.

    【讨论】:

      【解决方案4】:

      任何一种方法都可用于检查。

      至于哪个是最好的,您必须查看应用程序的大小以及实施每个应用程序需要多长时间。因此,如果这种情况只是偶尔发生,那么我可能会寻求更快的解决方案并实施时间戳选项。

      如果你想要更详细的谷歌并发 - 这里有一篇文章开始 - concirrency

      【讨论】:

        【解决方案5】:

        我正在使用第一个选项。更新每次更新的时间戳。所以在更新的时候我们会检查时间戳的相等性。

        【讨论】:

          【解决方案6】:

          乐观和悲观的术语是否敲响了警钟。这是解决您所描述问题的两种公认方法。听起来您在 Web 环境中工作。在这种情况下,前一个选项(乐观锁定)更合适。您已经继续描述了这通常是如何实现的。通常使用时间戳或版本号来检查自检索记录以来记录是否已更新。要考虑的另一件事是让您的用户知道基础数据发生了变化,并可能让他们选择在他们尝试保存的内容和其他用户保存的内容之间进行选择。这种选择实际上取决于业务规则是什么。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-02-03
            • 2020-03-13
            • 1970-01-01
            • 2020-06-08
            • 1970-01-01
            • 2017-03-23
            • 2021-10-26
            • 2020-12-26
            相关资源
            最近更新 更多