PostgreSQL并发计数器增量

eng*_*ent 10 postgresql performance concurrency

我需要为一个项目维护一个统计表,由项目列表及其使用情况组成(想想像一个网站,你想在其中计算浏览量)。每次实例化一个项目时,我都需要增加特定项目的使用量。

我的第一个实现是:

statistics(
  id      integer NOT NULL,
  name    character varying(255) NOT NULL,
  usage   integer NOT NULL DEFAULT 0,
);


UPDATE statistics 
  SET usage = usage + 1
WHERE name = '<name>';
Run Code Online (Sandbox Code Playgroud)

我担心的是性能和并发性。更新过程将由几十个(可能是 80-120 个)设备实例化,并且每秒可能发生几次,所以我的问题是:

1)这个方法会保持并发吗?(即,如果多个设备“同时”请求更新,每个请求都会被计算在内吗?)

2)你能建议一个最好的方法来实现结果吗?我希望在写入更新时有负载,而读取会更频繁。是否存在增加值的特定函数?我在看“序列”,但我不确定这是否是正确的方法......

非常感谢您的任何建议

a_h*_*ame 7

第二次更新将等待提交相同行的前一次更新,但随后会看到提交的值。

假设两个并发事务以初始值为 0 更新同一行

时间转换 1 T1 值 交易 2 T2 值
-------------------------------------------------- ------------
1 更新 ... 1 0
2 1 更新..“未定义”
                                (等待) 
3 提交 1 2
4 1 提交 2
5 2 2 

“T1 价值”和“T2 价值”是指该交易看到的价值。

如果您想确保捕获存在“不兼容”更改的情况(例如,一个事务将usage列设置为特定值,而不是仅仅增加它),您可以将所有事务放入“可序列化”隔离级别。但是您需要为错误处理做好准备。

对不同名称的更新可以同时运行而无需任何等待(因为不同的行受到影响)。

SELECTs 永远不会被阻止,但只会看到提交的值。