簡體   English   中英

並發值修改是否會影響PostgreSQL 9.1中的單選?

[英]Can concurrent value modification impact single select in PostgreSQL 9.1?

考慮在PostgreSQL 9.1(或9.2)中執行的以下查詢:

SELECT * FROM foo WHERE bar = true

假設它是一個相當長時間運行的查詢(例如,花一分鍾)。

如果在查詢開始時有500萬條記錄,其中bar = true ,則在另一個事務中的查詢期間,在foo表中添加和刪除行,對於某些現有行,對bar字段進行更新。

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

我知道單個事務中單獨語句之間的事務隔離和可見性,但是正在運行的單個語句呢?

沒有。
由於MVCC模型,只有在查詢開始時可見的元組才會在單個SELECT 手冊中詳細信息在這里

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

強調我的。

查詢將是查詢開始時數據的讀一致視圖。 在Postgresql中,有關多版本並發控制(MVCC)的文檔解釋了它是如何完成的(表中存在多個版本的記錄)。 在Oracle中,序列變更編號(SCN)與修改數據的“前映像”一起使用。 這是一個舊文檔, Postgresql中的事務處理, “非覆蓋存儲管理”一節。 但看看MVCC。

或者閱讀Postgresql文檔中有關MVCC的章節

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM