【发布时间】:2018-03-23 10:48:32
【问题描述】:
我有一个类似下面的查询,用于在通过特定网关发生每笔交易后增加交易计数。以下查询用于执行事务维护作业的 PHP 应用程序。如何确保两个并发更新不会造成计数问题?
考虑使用 PostgreSQL 的咨询锁,但不确定如何在以下上下文中使用它。 Java 中的引用很少,但在 PHP 中相对较新。
查询1(查找要更新的记录):
SELECT id
FROM Client.gatewaystat_tbl
WHERE clientid = 1 AND gatewayid = 2 ;
如果找到记录:
UPDATE gatewaystat_tbl gt
SET statvalue = statvalue + 1
WHERE id = '<from above query>'
如果没有找到记录:
INSERT INTO client.gatewaystat_tbl
(gatewayid, clientid, statetypeid, statvalue)
VALUES (2, 1, 1, 1);
上面的代码可能在一秒钟内被多次调用,因为在高峰时段交易量会非常大,每次交易后计数器 (statvalue) 需要增加。如何确保多个线程不会同时尝试更新计数并最终得到错误数据?
【问题讨论】:
标签: php postgresql concurrency