2017-02-27 45 views
1

我有一個python腳本在Redshift中執行多個sql腳本(一個接一個地)。這些sql腳本中的一些表可以多次查詢。例如。表t1可以在一個腳本中選擇,並可以在另一個腳本中刪除/重新創建。整個過程在一個事務中運行。現在,有時候,我得到了死鎖檢測錯誤,並且整個事務被回滾。如果表中存在死鎖,我想等待表被釋放,然後重試sql執行。對於其他類型的錯誤,我想回滾事務。從文檔看來,直到事務結束時纔會釋放表鎖。我想實現全部或者沒有數據變化(這是通過使用事務完成的),但也想處理死鎖。有關如何完成這一任務的任何建議?在紅移處理鎖

回答

0

我將執行所有你是指在一個事務中與重試循環的SQL。下面是我用來處理併發問題和重試(爲了簡潔起見,僞碼)的邏輯。我沒有系統無限期地等待鎖釋放。相反,我會在應用程序中通過重試來處理它。

begin transaction 
while not successful and count < 5 
    try 
     execute sql 
     commit 
    except 
     if error code is '40P01' or '55P03' 
      # Deadlock or lock not available 
      sleep a random time (200 ms to 1 sec) * number of retries 
     else if error code is '40001' or '25P02' 
      # "In failed sql transaction" or serialized transaction failure 
      rollback 
      sleep a random time (200 ms to 1 sec) * number of retries 
      begin transaction 
     else if error message is 'There is no active transaction' 
      sleep a random time (200 ms to 1 sec) * number of retries 
      begin transaction 
    increment count 

關鍵零部件捕捉每一個type of error,知道哪些情況下需要回滾,並且具有exponential backoff for retries

+0

如果我理解正確,你建議在每個sql腳本之後提交,並只回滾出錯的腳本。當出現死鎖錯誤時,是否無法確保所有sql腳本在一個事務下運行? – stech

+1

我建議你在一個事務中運行所有的SQL(我的'execute sql'行)。如果它死鎖或失敗,則重試整個事情。您也可能對保存點感興趣,但我從未使用過它們,也不知道它是否可用於redshift:https://www.postgresql.org/docs/current/static/sql-savepoint.html –

+0

忽略我對使用保存點的評論。回滾到保存點不紅移可供選擇:http://docs.aws.amazon.com/redshift/latest/dg/c_unsupported-postgresql-functions.html –