2016-07-05 6 views
3

はすべて同じクエリを実行する複数の並列トランザクションがあると言うことができますか?postgresqlは複数の行にわたってSELECT FOR UPDATEですか?</p> <pre><code>SELECT * FROM table1 FOR UPDATE; </code></pre> <p>デッドロックにこの結果をすることができます

別の言い方をすると。上記の文の「すべての行をロックする」操作はアトミックか、レコードが処理されている間に取得されたロックですか?

答えて

2

はい、デッドロックが発生する可能性があります。

これは非常に簡単に説明できます。

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

...そして並行して、これらの2つのクエリを実行します。:テストテーブルを設定

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; 
を使用してアトミックに行うことができます
関連する問題

 関連する問題