Python与Postgres:psycopg2.connect会锁表吗?

2 投票
1 回答
3316 浏览
提问于 2025-04-18 04:17

我正在运行一个Python脚本来进行ETL(提取、转换、加载),我把所有的PostgreSQL查询放在一个事务里。这个事务是这样的:

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 个回答

3

我知道在运行q4的时候,表会被锁住,但我不确定在整个事务过程中(从连接到提交)表是否一直被锁住?

锁是在第一次需要的时候被加上的,并且在事务提交时才会释放,而不是在之前。

所以在你的情况里,你在执行q4之前并没有访问t,所以锁就是在那时候加上的。UPDATE操作会在表上加一个ROW EXCLUSIVE。尽管名字里有“行”,但其实这是一个表级锁;另外,更新的行也会被加上行级锁。

有没有办法测试一下表是否被锁住?我现在的数据不多(大约100行)……

可以查询pg_locks。要明白,锁有表级和行级两种。

撰写回答