2016-07-05 70 views

回答

2

是的,它可能导致死锁。

这很容易演示。建立一个测试表:

CREATE TABLE t AS SELECT i FROM generate_series(1,1000000) s(i); 

...然后并行运行这两个查询:

SELECT i FROM t ORDER BY i FOR UPDATE; 
SELECT i FROM t ORDER BY i DESC FOR UPDATE; 

可以防止死锁的发生,确保所有进程获得他们锁在同一顺序。或者,如果要锁定表中的每条记录,可以使用table lock

LOCK t IN ROW SHARE MODE;