我認爲如果一個進程從一個唯一的用戶標識中選擇餘額並嘗試進行插入,那麼餘額將被錯誤地更新,但是另一個進程在該情況發生之前讀取餘額。我該如何解決?如何在PostgreSQL存儲過程中查詢原子?
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;
如果我們說,同時執行數以千計的查詢,每個查詢都會爲該特定用戶設置「balance = balance + $ 2」,會發生什麼?難道在某個時候,「平衡」將會從較早的時間開始,增加/減少$ 2,失去一些中間增加/減少?爲什麼? – PF4Public 2015-12-23 14:10:19
@ PF4Public使用[ACID](http://stackoverflow.com/questions/3740280/acid-and-database-transactions)兼容數據庫的重點在於避免出現此類問題。 ISOLATION LEVEL READ COMMITTED對於顯示的單個UPDATE語句已足夠。如提供的文檔鏈接中所討論的,更復雜的交易可能需要更高的級別。 – gwaigh 2015-12-23 15:08:52
感謝您的回答和澄清 – PF4Public 2015-12-24 18:06:03