2012-08-24 17 views
8

考慮的PostgreSQL 9.1(或9.2)執行以下查詢:併發值修改是否影響PostgreSQL 9.1中的單選?

SELECT * FROM foo WHERE bar = true 

假設這是一個相當長時間運行的查詢(例如以一分鐘)。

如果在查詢開始有500萬點的記錄進行bar = true成立,這個查詢在其他事務期間有行加入,並在foo表中刪除,而對於一些現有行更新到bar做領域。

這是否會影響上面顯示的選擇查詢的結果?

我知道單個事務中單獨語句之間的事務隔離和可見性,但是運行單個語句的情況如何?

回答

10


由於MVCC模型只,在查詢開始是可見的元組將在一個SELECT使用。手冊中的詳細信息here

Read Committed是PostgreSQL中的默認隔離級別。當一個 事務使用此隔離級別時,SELECT查詢(沒有FOR UPDATE/SHARE子句)僅查看在查詢開始之前提交的數據; 它從不會看到未提交的數據或 由併發事務執行查詢期間提交的更改。實際上,SELECT查詢 在查詢開始到 運行的瞬間即可看到數據庫的快照。但是,SELECT確實可以看到在其自己的事務中執行的先前更新 的效果,即使它們尚未提交。 另請注意,如果在執行第一個SELECT期間其他事務提交更改,則兩個連續的SELECT命令可以看到不同的數據,即使它們在單個事務中也是如此。

強調我的。

5

該查詢將是查詢開始時的數據的一致性視圖。在Postgresql中,關於多版本併發控制(MVCC)的文檔解釋了它是如何完成的(表中存在多個版本的記錄)。在Oracle中,序列更改號碼(SCN)與修改後數據的「前映像」一起使用。這是一箇舊文檔,Transaction Processing in Postgresql,其中有「不覆蓋存儲管理」部分。但看看MVCC。

或閱讀Postgresql文檔中的MVCC一章