Sql 使用事务更新数据库中的计数器
要加快对Sql 使用事务更新数据库中的计数器,sql,postgresql,Sql,Postgresql,要加快对posts表中的行进行排序,请按exmapleViewScont、CommentScont和LoveScont存储每个参数的计数器。然而,我不确定将数据插入数据库并增加计数器的过程是否正确。以下是我的工作: 开始交易 向表视图(或视图、注释)插入新行 将父表上的计数器增加1 承诺 我的目标是,只有当第2点和第3点都成功避免了添加注释而计数器并没有增加的情况下,才能提交,反之亦然 我不确定我是否完全理解本例中的事务是如何工作的——在事务提交之前,如果另一个查询也尝试更新计数器,会发生什么情
posts
表中的行进行排序,请按exmapleViewScont
、CommentScont
和LoveScont
存储每个参数的计数器。然而,我不确定将数据插入数据库并增加计数器的过程是否正确。以下是我的工作:
还有人能告诉我在这里使用事务是否会对性能产生影响吗?最好的办法是试试看 您将发现,在步骤3,当您
更新父表的计数器时,将对正在更新的行执行行级写锁定。任何其他并发事务在尝试更新
时将阻塞该锁,直到第一个事务(获得锁的事务)回滚或提交。然后,另一个事务将获得锁并继续
这意味着您的方法可以工作,但会大大降低并发性。如果您的事务很短,并且父对象没有很强的竞争性,这可能是正常的,这取决于您的应用程序。为了避免如此多的更新,您可以有一个精简表,在其中为每个视图/爱情/评论插入一条记录。然后,每隔一段时间更新posts表。如果您不喜欢即时更新posts表,这将起作用。对精益表的并发插入不会互相锁定。这不是一个选项,因为我需要立即更新计数器。虽然这是一个有趣的解决方案,但基本上我将这样的行插入到表的loves、views
,以及content
到表的comments
。更新表posts只是将一个计数器(视图/爱/评论)增加一个(在表posts
中)。所以,当其中一个操作失败时,没有一个事务不会写入锁行并只是回滚?那么触发器呢?如果我在更新计数器的表loves/views/comments
上实现触发器,会有什么不同?@user606521 Counter rollback或increment on commit将是一个很酷的功能-但是,没有什么比说“在我提交时向此行添加1,并且仅在我提交时添加1”更好的方法了。无论使用触发器还是直接客户端SQL都没有区别。但是触发器将比两个单独的查询更快,对吗?(注意,迁移之类的功能会很好-对于一个查询,您只需传递另一个“回滚”的查询(也称为迁移“向下”方法)it…@user606521是的,触发器将减少往返,因此可能会更快。小心死锁。至于在回滚时运行查询,因为不能保证查询会成功,因为查询永远不会运行。相反,需要一个特定的计数器功能。