PostgreSQL 筆記 - Transaction 概念與應用
交易情境範例
以下範例模擬小明向小美轉帳 50 元的情境。
首先,小明的帳戶餘額減少 50 元:
接著,小美的帳戶增加 50 元:
若在這兩個步驟之間發生異常(如伺服器故障或程式中斷),可能導致小明的錢已扣除,但小美卻未收到款項,造成資料不一致問題。交易(Transaction)便是用來解決此類問題的機制。
透過交易,我們能確保多個相關的 SQL 語句作為單一整體被處理:所有語句都成功執行,或全部取消(回滾,Rollback),以避免資料的不一致性。
開啟與關閉交易(Opening and Closing Transactions)
在 PostgreSQL 中,任何從 PgAdmin 或應用程式連接到資料庫的行為都會建立一個獨立的連線(Connection)。每個連線都能夠獨立執行交易。
開啟一個交易:
執行更新操作(如轉帳範例),此時小明的帳戶餘額會先暫時更新,但尚未永久儲存至資料庫:
接著,更新小美的帳戶:
確認以上所有操作正確無誤後,透過提交(Commit)來永久儲存變更:
若執行過程中發現錯誤或因其他原因決定取消,可使用以下語句回滾(Rollback),將所有操作復原到交易前的狀態:
此外,若連線中斷或發生異常,PostgreSQL 也會自動進行回滾,以保持資料庫的一致性。
交易鎖定(Transaction Lock)
當 PostgreSQL 進行交易操作時,會透過鎖定(Lock)來管理資料的一致性與並行存取問題。鎖定機制可避免多個交易同時修改相同資料而產生衝突。
交易鎖主要分成兩種類型:
- 共享鎖(Shared Lock):允許多個交易同時讀取同一筆資料,但無法對該資料進行修改。
- 排他鎖(Exclusive Lock):一旦某個交易持有排他鎖,其他交易將無法讀取或修改該資料,直到該鎖被釋放為止。
若交易發生鎖定衝突(例如兩個交易互相等待對方釋放鎖定),可能導致死鎖(Deadlock)。PostgreSQL 會自動檢測並處理死鎖情況,透過中止其中一個交易來解決衝突,避免永久阻塞。