想象一下下面的场景,我们有一个表,其中行插入了一些约束。 例如,在修改数据和锁定之前进行聚合检查
- SELECT COUNT(*)FROM表WHERE ....
- 检查,如果计数低于某个值
- 如果条件为真 - INSERT ...,否则 - ROLLBACK
它的工作,如果我们没有太多的并发查询。 对于处理并发请求,有几种方法:
- 将计数器保存到另一个表或Redis中。并在每次更新时管理此计数器。
- 每次插入前锁定整个表格。
我正在使用PostgreSQL.What是解决这种情况的最佳方法?
想象一下下面的场景,我们有一个表,其中行插入了一些约束。 例如,在修改数据和锁定之前进行聚合检查
它的工作,如果我们没有太多的并发查询。 对于处理并发请求,有几种方法:
我正在使用PostgreSQL.What是解决这种情况的最佳方法?
尝试使用statement_timeout
和lock_timeout
明确set
而不是每个用户会话。详情请看here。
锁定表格非常极端,会严重影响并发性。
在单独的表中维护一个计数器会更好;它基本上会序列化INSERT
s(一旦前一个交易释放了锁定,下一个交易只能更新计数器)。
第三种方法是使用SERIALIZABLE
事务。如果涉及的所有交易都是SERIALIZABLE
,则只要您在单个交易中执行SELECT count(*) ...
和INSERT
,就会自动保证您的条件。 不足之处是事务可能因序列化错误而中止,并且您必须准备好重试它们。
谢谢你的回答。 – user3928409
这是怎么连接到这个问题? –