Postgresql

跨並發會話強制執行最低事務隔離級別?

  • March 18, 2020

我正在嘗試在 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;

我如何確保此類操作不會呼叫鎖,因為它們引用的是同一個表?

沒有鎖定您的場景的危險。

唯一使用facttableACCESS SHARE鎖是防止其他人在讀取表時刪除或更改表的鎖。既然ACCESS SHARE 不和自己衝突,那沒問題(兩個人可以看同一張海報)。

唯一需要考慮的是 I/O 負載:如果許多程序對錶執行順序掃描,這可能會很嚴重。您應該嘗試通過同時啟動所有程序來從 PostgreSQL 的同步順序掃描中受益,以便它們有機會同步它們的順序掃描。

引用自:https://dba.stackexchange.com/questions/262142