1

ETL (抽出、変換、読み込み) を実行する Python スクリプトを実行しており、すべての psql クエリを 1 つのトランザクションに入れています。トランザクションは次のとおりです。

conn = psycopg2.connect(...)
try:
    cur = conn.cursor() #q1
    cur.execute("create temp table tt (like t INCLUDING DEFAULTS)") #q2
    cur.execute("copy tt from '/file.csv' DELIMITER ',' CSV HEADER ") #q3
    cur.execute("...") #q4,   update t based on data from tt
    conn.commit()
except:
    conn.rollback()

q4 を実行するとテーブルがロックされることはわかっていますが、トランザクション全体 (接続からコミットまで) でテーブルがロックされるかどうかはわかりません。

テーブルがロックされているかどうかをテストする方法はありますか? 現在、データはあまりありません (約 100 行)。

どうもありがとう!

4

1 に答える 1

3

q4 を実行するとテーブルがロックされることはわかっていますが、トランザクション全体 (接続からコミットまで) でテーブルがロックされるかどうかはわかりません。

ロックは、最初に必要になったときに取得され、トランザクションのコミット前ではなくコミット時に解放されます。

したがって、あなたの場合、tまでアクセスしないq4ので、ロックがかかるときです。UPDATEテーブルをROW EXCLUSIVEロックします。その名前にもかかわらず、これはテーブル レベルのロックです。さらに、更新された行に対して行レベルのロックが適用されます。

テーブルがロックされているかどうかをテストする方法はありますか? 現在、データはあまりありません (約 100 行)。

クエリpg_locks。テーブルレベルと行レベルの両方のロックがあることを理解してください。

于 2014-04-26T05:48:02.280 に答える