PostgreSQL计数器的并发增量


9

我需要维护一个项目的统计表,该表由项目列表及其用途组成(想想一个类似网站的网站,您希望在其中计算综合浏览量)。每次实例化一个项目时,我都需要增加特定项目的使用率。

我的第一个实现是:

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>';

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

1)这种方法会保留并发性吗?(即,如果有多个设备“同时”请求更新,是否将每个请求都计入?)

2)您能建议一种实现结果的最佳方法吗?我希望在编写更新时会负担很多,而阅读会更频繁。是否存在增加值的特定功能?我正在查看“序列”,但不确定是否正确。

提前非常感谢您的任何建议

Answers:


5

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

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

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

“ T1值”和“ T2值”表示该交易看到的值。

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

对不同名称的更新可以并发运行,而无需等待(因为会影响不同的行)。

SELECT不会被阻止,而只会看到comitted值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.