如何解決錯誤「錯誤: 1023 詳細資料: Redshift 中資料表上的可序列化隔離違規?」

2 分的閱讀內容
0

我在不同的工作階段中並行執行 Amazon Redshift 作業時,收到訊息「錯誤: 1023 詳細資料: Redshift 中資料表上的可序列化隔離違規。」 如何解決此錯誤?

簡短說明

Amazon Redshift 中的並行寫入作業必須為可序列化。這表示交易必須能夠以至少一種順序連續執行,從而產生與交易並行執行相同的結果。如需詳細資訊,請參閱可序列化隔離

使用以下一種或全部方法來解決可序列化隔離錯誤:

  • 為實現原子性,將不必位於同一交易的作業移到交易之外
  • 透過鎖定每個工作階段中的所有資料表來強制序列化
  • 對並行交易使用快照隔離

解決方案

為實現原子性,將不必位於同一交易的作業移到交易之外

當兩個交易內的個別作業以可能會影響另一個交易結果的方式相互參照時,請使用此方法。例如,假設兩個工作階段各自啟動一個交易:

Session1_Redshift = # BEGIN;
Session2_Redshift = # BEGIN;

每個交易中的 SELECT 陳述式結果可能會受到另一個交易中的 INSERT 陳述式的影響。如果以任何順序連續執行,則一個 SELECT 陳述式的結果一律會比交易並行執行時多傳回一個資料列。由於沒有可以連續執行作業的順序,而無法產生與並行執行相同的結果,因此執行的最後一個作業會導致可序列化隔離錯誤:

Session1_redshift=# select * from tab1;
Session1_redshift =# insert into tab2 values (1);
Session2_redshift =# insert into tab1 values (1);
Session2_redshift =# select * from tab2;

如果 SELECT 陳述式的結果並不重要 (即交易中作業的原子性不重要),請移動 SELECT 陳述式,讓它們位於交易之外。例如:

Session1_Redshift=# BEGIN;
Session1_Redshift = # insert into tab1 values (1)
Session1_Redshift = # END;
Session1_Redshift # select * from tab2;
Session2_Redshift # select * from tab1;
Session2_Redshift =# BEGIN;
Session2_Redshift = # insert into tab2 values (1)
Session2_Redshift = # END;

在這些範例中,交易中並不存在相互參照。這兩個 INSERT 陳述式不會彼此影響。由於至少有一種順序可讓交易連續執行,從而產生與並行執行相同的結果,因此交易為可序列化。

透過鎖定每個工作階段中的所有資料表來強制序列化

LOCK 命令會封鎖可能會導致可序列化隔離錯誤的作業。當您使用 LOCK 命令時,請務必執行以下動作:

  • 鎖定所有受交易影響的資料表,包括受交易內唯讀 SELECT 陳述式影響的資料表。
  • 以相同的順序鎖定資料表,而不考慮作業的執行順序。
  • 在執行任何作業之前,於交易開始時鎖定所有資料表。

對並行交易使用快照隔離

SERIALIZABLE 選項實作嚴格序列化,如果結果無法映射到並行執行交易的連續順序,則交易可能會失敗。

SNAPSHOT ISOLATION 選項允許較高的並行性,因此對同一資料表中不同資料列的並行修改可順利完成。

交易繼續在資料庫的最新確認版本或快照上運作。

使用 CREATE DATABASEALTER DATABASE 命令中的 ISOLATION LEVEL 參數,在資料庫上設定快照隔離。

若要檢視資料庫使用的並行模型,請執行以下範例STV_DB_ISOLATION_LEVEL 查詢:

SELECT * FROM stv_db_isolation_level;
The database can then be altered to SNAPSHOT ISOLATION:
ALTER DATABASE sampledb ISOLATION LEVEL SNAPSHOT;

更改資料庫的隔離層級時,請考量以下事項:

  • 您必須具有目前資料庫的超級使用者或 CREATE DATABASE 權限,才能變更資料庫隔離層級。
  • 您無法更改 DEV 資料庫環境的隔離層級。
  • 您無法更改交易區塊中的隔離層級。
  • 如果其他使用者已連接至資料庫,則 alter isolation level 命令會失敗。
  • alter isolation level 命令可以更改目前工作階段的隔離層級設定。

相關資訊

管理並行寫入作業

AWS 官方
AWS 官方已更新 2 年前