2014-04-25 49 views
0

我正在運行一個python腳本來執行ETL(提取,轉換,加載),並將所有的psql查詢放在一個事務中。這裏的交易:Python&Postgres:會psycopg2.connect鎖定表嗎?

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() 

我知道該表將被鎖定,運行時第4季度,但我不知道,如果表將在整個交易過程中(從連接犯)被鎖定?

有沒有辦法測試表是否被鎖定?我現在沒有太多數據(大約100行)。

非常感謝!

+0

Python沒有'catch'。它有'except'。另外我不認爲有理由爲每個連接鎖定表格。 – msvalkon

+0

是的,我的錯誤。應該是除外。 @msvalkon謝謝! – odieatla

+0

你不應該使用無條件'except'。至少,'除了異常',但最好'除了psycopg2.DatabaseError'。你也應該總是記錄或重新拋出異常,永遠不要沉默地吞下它。 –

回答

2

我知道在運行q4時表將被鎖定,但我不確定在整個事務(從連接到提交)期間表是否被鎖定?

第一次需要時會執行鎖定,並在事務提交時釋放,而不是在此之前。

所以在你的情況下,你不訪問t,直到q4,所以這是鎖定時。 UPDATE takes a ROW EXCLUSIVE lock on the table。儘管這個名字,它是一個表級鎖;此外,在更新的行上執行行級鎖。

有沒有辦法測試表是否被鎖定?我現在沒有太多的數據(大約100行)。

Query pg_locks。瞭解有表和行級鎖。