【发布时间】:2013-02-02 09:45:09
【问题描述】:
我认为如果一个进程从唯一的用户 ID 中选择余额并尝试进行插入,但另一个进程在此之前读取了余额,我认为余额将被错误地更新。我该如何解决这个问题?
CREATE OR REPLACE FUNCTION incBalance(INTEGER, BIGINT) RETURNS void AS $$
DECLARE
balanceRecord record;
newBalance bigint;
BEGIN
FOR balanceRecord IN
SELECT balance FROM users WHERE userid = $1
LOOP
newBalance := balanceRecord.balance + $2;
UPDATE users SET balance = newBalance WHERE userid = $1;
END LOOP;
RETURN;
END;
$$ LANGUAGE plpgsql;
【问题讨论】:
标签: postgresql concurrency atomic plpgsql