2016-07-26 62 views
0

想象一下下面的场景,我们有一个表,其中行插入了一些约束。 例如,在修改数据和锁定之前进行聚合检查

  1. SELECT COUNT(*)FROM表WHERE ....
  2. 检查,如果计数低于某个值
  3. 如果条件为真 - INSERT ...,否则 - ROLLBACK

它的工作,如果我们没有太多的并发查询。 对于处理并发请求,有几种方法:

  1. 将计数器保存到另一个表或Redis中。并在每次更新时管理此计数器。
  2. 每次插入前锁定整个表格。

我正在使用PostgreSQL.What是解决这种情况的最佳方法?

回答

0

尝试使用statement_timeoutlock_timeout明确set而不是每个用户会话。详情请看here

+0

这是怎么连接到这个问题? –

0

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

在单独的表中维护一个计数器会更好;它基本上会序列化INSERT s(一旦前一个交易释放了锁定,下一个交易只能更新计数器)。

第三种方法是使用SERIALIZABLE事务。如果涉及的所有交易都是SERIALIZABLE,则只要您在单个交易中执行SELECT count(*) ...INSERT,就会自动保证您的条件。 不足之处是事务可能因序列化错误而中止,并且您必须准备好重试它们。

+0

谢谢你的回答。 – user3928409