upvotes和downvotes的数据库

时间:2018-04-28 20:32:19

标签: sql database

如果我有一个文章的数据库,我有一个upvotes字段。 我正在考虑创建一个SQL查询,我将首先获得upvotes的当前值,然后我将增加1到值

但是,如果5个人同时点击upvote按钮会发生什么呢?

还是有更好的方法来完成这个*

2 个答案:

答案 0 :(得分:2)

我的强烈建议是在Site # Room {{ id }} 表中保留每个upvote和downvote的记录:

votes

然后,您可以根据需要汇总投票。您可以看到一段时间内的投票趋势。如果他们过去投票,你可以确保某人可以“不投票”。

并且,插入表格不会导致不同用户互相干扰。

缺点是总结结果需要更多时间。当问题出现时,您可以对其进行优化。

答案 1 :(得分:1)

有两种解决方案:

  1. 如果您确实需要将值加载到应用程序中并在那里递增,之后再将其写回,请在选择值之前对表进行适当的锁定。完成该值后释放锁定。因为取消或重写实际的upvote。

    否则,并发实例 B 可能已读取相同的值并在第一个实例 A 之后将其写回。说两个都读 3 。两者都将其增加到 4 。然后 A B 之前将其写回,数据库中的值为 4 B 并将其写回而且数据库中的值是 4 。虽然 3 + 2 = 5 。因此,一个upvote会以这种方式“丢失”。它被称为“丢失更新问题”。

    您可以使用上述锁定来防止此问题。由于 B 在更新和释放锁之前无法从表中读取。然后它将读取 4 而不是 3 ,因此回写 5 ,这是正确的。

  2. 但最好是在一次更新中进行,例如

    UDPATE votes
           SET votes = votes + 1
           WHERE article = @some_id;
    

    也就是说,无论您的应用程序认为此值当前是什么,您都会增加数据库中的实际值。

    如果您的事务具有适当的隔离级别,则数据库将自行处理锁定,从而使并发事务不会使用“脏”的过时数据进行更新。

  3. 我建议,您可以阅读更多有关事务,隔离级别和锁定的内容以充分了解问题。