Python& Postgres:将psycopg2.connect锁定表吗?

时间:2014-04-25 20:30:55

标签: python database postgresql transactions table-locking

我正在运行一个python脚本来执行ETL(提取,转换,加载),并将所有psql查询放在一个事务中。这是交易:

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行)..

非常感谢!

1 个答案:

答案 0 :(得分:3)

  

我知道在运行q4时表会被锁定,但是我不确定在整个事务期间(从连接到提交)表是否会被锁定?

首次需要时锁定,并在事务提交时释放,而不是之前。

因此,在您的情况下,您在t之前无法访问q4,以便在锁定时进行访问。 UPDATE takes a ROW EXCLUSIVE lock on the table。尽管有这个名字,它还是一个桌级锁;此外,对已更新的行采取行级锁定。

  

有没有办法测试表是否被锁定?我现在没有太多数据(约100行)..

Query pg_locks。了解同时存在表级和行级锁。