Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用事务更新数据库中的计数器_Sql_Postgresql - Fatal编程技术网

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

Sql 使用事务更新数据库中的计数器,sql,postgresql,Sql,Postgresql,要加快对posts表中的行进行排序,请按exmapleViewScont、CommentScont和LoveScont存储每个参数的计数器。然而,我不确定将数据插入数据库并增加计数器的过程是否正确。以下是我的工作: 开始交易 向表视图(或视图、注释)插入新行 将父表上的计数器增加1 承诺 我的目标是,只有当第2点和第3点都成功避免了添加注释而计数器并没有增加的情况下,才能提交,反之亦然 我不确定我是否完全理解本例中的事务是如何工作的——在事务提交之前,如果另一个查询也尝试更新计数器,会发生什么情

要加快对
posts
表中的行进行排序,请按exmaple
ViewScont
CommentScont
LoveScont
存储每个参数的计数器。然而,我不确定将数据插入数据库并增加计数器的过程是否正确。以下是我的工作:

  • 开始交易
  • 向表视图(或视图、注释)插入新行
  • 将父表上的计数器增加1
  • 承诺
  • 我的目标是,只有当第2点和第3点都成功避免了添加注释而计数器并没有增加的情况下,才能提交,反之亦然

    我不确定我是否完全理解本例中的事务是如何工作的——在事务提交之前,如果另一个查询也尝试更新计数器,会发生什么情况?交易会失败吗?也许我应该使用特定类型的交易?现在我使用的是可重复阅读


    还有人能告诉我在这里使用事务是否会对性能产生影响吗?

    最好的办法是试试看

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


    这意味着您的方法可以工作,但会大大降低并发性。如果您的事务很短,并且父对象没有很强的竞争性,这可能是正常的,这取决于您的应用程序。

    为了避免如此多的更新,您可以有一个精简表,在其中为每个视图/爱情/评论插入一条记录。然后,每隔一段时间更新posts表。如果您不喜欢即时更新posts表,这将起作用。对精益表的并发插入不会互相锁定。这不是一个选项,因为我需要立即更新计数器。虽然这是一个有趣的解决方案,但基本上我将这样的行插入到表
    的loves、views
    ,以及
    content
    到表
    的comments
    。更新表posts只是将一个计数器(视图/爱/评论)增加一个(在表
    posts
    中)。所以,当其中一个操作失败时,没有一个事务不会写入锁行并只是回滚?那么触发器呢?如果我在更新计数器的表
    loves/views/comments
    上实现触发器,会有什么不同?@user606521 Counter rollback或increment on commit将是一个很酷的功能-但是,没有什么比说“在我提交时向此行添加1,并且仅在我提交时添加1”更好的方法了。无论使用触发器还是直接客户端SQL都没有区别。但是触发器将比两个单独的查询更快,对吗?(注意,迁移之类的功能会很好-对于一个查询,您只需传递另一个“回滚”的查询(也称为迁移“向下”方法)it…@user606521是的,触发器将减少往返,因此可能会更快。小心死锁。至于在回滚时运行查询,因为不能保证查询会成功,因为查询永远不会运行。相反,需要一个特定的计数器功能。