1

我正在运行一个 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 行)..

非常感谢!

4

1 回答 1

3

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

锁在第一次需要时被获取,并在事务提交时释放,而不是之前。

所以在你的情况下,你不能访问tuntil q4,所以那是锁定的时间。UPDATEROW EXCLUSIVE锁锁在桌子上。尽管有这个名字,但它是一个表级锁;此外,对更新的行采取行级锁。

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

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

于 2014-04-26T05:48:02.280 回答