Postgresql
跨並發會話強制執行最低事務隔離級別?
我正在嘗試在 PostgreSQL 中更好地學習事務並且遇到了這個觀察結果。
我有一種情況,我在多個會話中使用 SQL 語句創建多個表。我正在使用
CREATE TABLE *table_name* AS *sql_stmt*
(CTAS)語法。我認為這是一個安全的操作,可以同時執行(在我的多個會話中),因為它不會更新任何數據,因此我想確保我始終擁有盡可能少的限制性鎖定。話雖如此,多個會話仍在創建數據(表),所以我很擔心如果 SQL 語句包含對同一個表的引用,我可能會呼叫一個鎖,即使我知道它對我的操作是安全的記住。換句話說,我知道我的所有操作都是只讀的(因此可以使用非限制性的鎖)並且沒有表會有更新的數據,但需要注意的是我還將結果保存為表(所以這不再是 100% 只讀的;可能會在某個時候呼叫一些限制性鎖?)。因此,我的問題如下:在執行 CTAS 工作負載時,如何確保所有並發會話的鎖定限制最低?
例如,假設我有兩個會話。一個是發出以下命令:
CREATE TABLE t1 AS SELECT * FROM facttable;
另一個同時出現的問題:
CREATE TABLE t2 AS SELECT * FROM facttable;
我如何確保此類操作不會呼叫鎖,因為它們引用的是同一個表?
沒有鎖定您的場景的危險。
唯一使用
facttable
的ACCESS SHARE
鎖是防止其他人在讀取表時刪除或更改表的鎖。既然ACCESS SHARE
不和自己衝突,那沒問題(兩個人可以看同一張海報)。唯一需要考慮的是 I/O 負載:如果許多程序對錶執行順序掃描,這可能會很嚴重。您應該嘗試通過同時啟動所有程序來從 PostgreSQL 的同步順序掃描中受益,以便它們有機會同步它們的順序掃描。