本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
寫入和讀/寫操作
透過決定何時與如何執行不同的類型的命令,您可以管理並行寫入操作的特定行為。以下是與此討論相關的命令:
-
COPY 命令,執行載入 (初始或增量)
-
INSERT 一次附加一或多個列的 命令
-
UPDATE 命令,可修改現有的資料列
-
DELETE 命令,其會移除資料列
COPY 和 INSERT操作是純寫入操作,但 DELETE和 UPDATE 操作是讀取/寫入操作。(若要讓資料列可供刪除或更新,必須先加以讀取。) 並行寫入操作的結果取決於並行執行的特定命令。COPY 與相同資料表的 和 INSERT操作會保留在等待狀態,直到鎖定釋放為止,然後它們會正常進行。
UPDATE 和 DELETE操作的行為不同,因為它們在進行任何寫入之前依賴初始資料表讀取。由於並行交易彼此看不到,因此 UPDATEs和 DELETEs 必須讀取上次遞交的資料快照。當第一個 UPDATE 或 DELETE釋出其鎖定時,第二個 UPDATE或 DELETE需要判斷要使用的資料是否可能過時。它將不會過時,因為第二個交易不會取得其資料的快照,直到第一個交易已釋出其鎖定為止。
並行寫入交易可能的死鎖情況
每當交易牽涉到一個以上資料表的更新,當它們都嘗試寫入相同的資料表集時,並行執行的交易有可能變得死鎖。交易會在認可或復原時一次釋出其所有資料表鎖定;它不會一次撤回一個鎖定。
例如,假設交易 T1 和 T2 在大約相同的時間開始。如果 T1 開始寫入資料表和 T2 開始寫入資料表 B,這兩個交易都可以繼續而不衝突;不過,如果 T1 完成寫入資料表並且必須開始寫入資料表 B,它將無法繼續,因為 T2 仍在 B 上保有鎖定。相反地,如果 T2 完成寫入資料表 B 並且必須開始寫入資料表 A,它將無法繼續,因為 T1 仍在 A 上保有鎖定。因為這兩個交易都可釋出其鎖定,直到其所有寫入操作都認可,因此沒有任一交易可以繼續。
為了避免這類的死鎖,您必須謹慎排程並行寫入操作。例如,在交易中,您應該一律以相同的順序更新資料表,如果指定鎖定,則在執行任何DML操作之前,以相同的順序鎖定資料表。