我正在运行一个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行)..
非常感谢!
答案 0 :(得分:3)
我知道在运行q4时表会被锁定,但是我不确定在整个事务期间(从连接到提交)表是否会被锁定?
首次需要时锁定,并在事务提交时释放,而不是之前。
因此,在您的情况下,您在t
之前无法访问q4
,以便在锁定时进行访问。 UPDATE
takes a ROW EXCLUSIVE
lock on the table。尽管有这个名字,它还是一个桌级锁;此外,对已更新的行采取行级锁定。
有没有办法测试表是否被锁定?我现在没有太多数据(约100行)..
Query pg_locks
。了解同时存在表级和行级锁。