我pg_try_advisory_lock()在Postgres 使用.
接下来的两个查询会锁定多个记录table1:
1)
SELECT a.id
FROM table1 a
JOIN table2 b ON a.table1_id = b.id
WHERE
table2.id = 1
AND
pg_try_advisory_lock('table1'::regclass::integer, a.id)
LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
但
SELECT a.id
FROM table1 a
JOIN table2 b ON a.table1_id = b.id
WHERE table2.id = 1
Run Code Online (Sandbox Code Playgroud)
返回一条记录.
2)
SELECT a.id
FROM table1 a
JOIN table2 b ON a.table1_id = b.id
JOIN table3 c ON b.table2_id = c.id
WHERE
table3.id = 1
AND
pg_try_advisory_lock('table1'::regclass::integer, a.id)
LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
但是我pg_try_advisory_lock()只需要锁定一条记录.
怎么了? …
我正在使用c3p0和postgres.我有一个多线程应用程序,如果没有正确的锁定,不同的线程可能会意外更新同一条记录.为了防止这种情况,我打算使用咨询锁.
SELECT pg_advisory_lock(id) FROM ...;
Run Code Online (Sandbox Code Playgroud)
但是,我不确定我是否可以将咨询锁与连接池结合使用,因为用于创建锁的连接会被关闭(这对应用程序逻辑是透明的)?相应的锁是否被释放?