假設我有以下簡單的代碼:
BEGIN;
WITH foo AS (SELECT * FROM t1),
bar AS (SELECT * FROM t1)
SELECT * FROM foo, bar;
COMMIT;
默認情況下,READ-COMMITTED隔離級別為. 這當然意味著如果你有兩個單獨的選擇,你可以(理論上)有不可重復的讀取。
我的問題是:在示例代碼中,這兩個不同的選擇是否算作單個讀提交命令,還是每個選擇都是獨立的,使得兩者(理論上)都可以看到不同的行?
uj5u.com熱心網友回復:
從這里WITH:
主查詢和 WITH 查詢都(名義上)同時執行。這意味著從查詢的其他部分看不到 WITH 中資料修改陳述句的效果,只能通過讀取其 RETURNING 輸出。如果兩個這樣的資料修改陳述句試圖修改同一行,結果是不確定的。
如果您想了解更多詳細資訊,請參閱CTE。在本節中,它貫穿了各種場景。
uj5u.com熱心網友回復:
所有三個掃描都是使用查詢的快照執行的,因此它們都可以保證看到資料庫的相同狀態。
uj5u.com熱心網友回復:
應用于您的示例的 EXPLAIN ANALYZE 提供如下內容:
Seq Scan on t1 (cost=0.00..71.21 rows=621 width=233) (actual time=0.015..0.102 rows=621 loops=1)"
Planning Time: 0.078 ms
Execution Time: 0.132 ms
這證實了@Anton Grig 的評論。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/352987.html
標籤:PostgreSQL 交易
