3
比方说,有多个并行交易,所有做同样的查询:postgresql是SELECT FOR UPDATE多行原子?
SELECT * FROM table1 FOR UPDATE;
可这导致死锁?
换句话说。上述语句中的操作是“锁定所有行”还是在处理记录时沿途获取的锁?
比方说,有多个并行交易,所有做同样的查询:postgresql是SELECT FOR UPDATE多行原子?
SELECT * FROM table1 FOR UPDATE;
可这导致死锁?
换句话说。上述语句中的操作是“锁定所有行”还是在处理记录时沿途获取的锁?
是的,它可能导致死锁。
这很容易演示。建立一个测试表:
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;