使用事务更新数据库中的计数器

时间:2014-07-19 07:43:24

标签: sql postgresql

为了加快对posts表格中的行进行排序,例如viewsCountcommentsCountlovesCount我为每个参数存储计数器。但是我不确定是否正确地将数据插入到数据库中以及递增计数器的过程。这是我的工作:

  1. 开始交易
  2. 将新行插入表格视图(或爱情或评论)。
  3. 将父表上的计数器增加1。
  4. 提交
  5. 我的目标是只在第2点和第2点都进行。 3成功地避免了添加例如注释并且计数器没有增加的情况,反之亦然。

    我不确定我是否完全理解这个例子中的事务是如何工作的 - 在转换提交之前会发生什么另一个查询也会尝试更新计数器?交易会失败吗?也许我应该使用特定类型的转换?现在我正在使用REPEATABLE READ。

    也可以告诉我,在这个地方使用交易会对性能产生影响吗?

1 个答案:

答案 0 :(得分:1)

最好的办法就是试试看。

您会发现,在步骤3中,当您UPDATE父表的计数器时,将对正在更新的行执行行级写锁定。任何其他并发事务将在尝试UPDATE时阻止该锁,直到第一个事务(获得锁定的事务)回滚或提交。然后另一个事务将获得锁定并继续。

这意味着您的方法将起作用,但会大大降低并发性。如果您的交易很短并且父对象的争议不是很高,那么它取决于您的应用程序。