Postgresql

是否可以讓 SELECT 等到正在進行的 UPDATE 完成?

  • June 12, 2018

假設我正在使用 PostgreSQL 實現銀行賬戶邏輯。在某些時候,我會想檢查使用者是否有足夠的餘額來執行操作。但是,使用者的餘額可能處於 UPDATE 語句的中間,並且在我看來,在此期間執行的任何 SELECT 語句都將返回舊的餘額。我的問題是:

  1. 我的看法是否正確,即 SELECT 語句是否有可能在這種微不足道的場景中獲取舊數據?
  2. 如果是,我該如何實施鎖來保護自己免受這種情況的影響?我在文件中閱讀了有關 FOR UPDATE 的資訊,但我不確定它是否適用於這種特定情況。

請假設我無法序列化客戶端中的請求。

是的,如果同一行已在另一個仍處於打開狀態的事務中更新,則 SELECT…FOR UPDATE 將阻止選擇。

更通用的解決方案是在可序列化隔離級別下執行您的事務,而不是使用 FOR UPDATE。這可能不會阻止 SELECT,而是會在稍後檢測到發生不可序列化的情況時將 ERROR 傳遞給事務。

“餘額足以執行操作”,這應該是一筆交易,支票和操作,否則支票是浪費時間。如果將它們分開,檢查和操作之間可能會發生很多事情。

引用自:https://dba.stackexchange.com/questions/209343