在修改数据和锁定之前进行聚合检查

时间:2016-07-26 03:35:36

标签: postgresql locking aggregate

想象一下以下场景,我们有一个表,其中行插入了一些约束。 例如,

  1. SELECT COUNT(*)FROM table WHERE ....
  2. 检查,如果计数小于某个值
  3. 如果条件为真 - INSERT ...,否则 - ROLLBACK
  4. 如果我们没有很多并发查询,它就可以工作了。 对于句柄并发请求,有以下几种方法:

    1. 将计数器保存到另一个表或Redis中。并在每次更新时管理此计数器。
    2. 在每次插入前锁定整个表格。
    3. 我正在使用PostgreSQL。解决这种情况的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

请尝试每个用户会话明确地statement_timeoutlock_timeout set。查看here了解详情。

答案 1 :(得分:0)

锁定表格非常极端,会严重损害并发性。

在另一张桌子上维护一个柜台会更好;它本质上会序列化INSERT s(下一个事务只能在前一个事务释放锁定COMMIT后才更新计数器)。

第三种方法是使用SERIALIZABLE次交易。如果所涉及的所有交易均为SERIALIZABLE,只要您在单笔交易中执行SELECT count(*) ...INSERT,您的条件就会自动得到保证。 缺点是事务可能会因序列化错误而中止,您必须准备好重试它们。