0

私は、書き込み可能な共通テーブル式をpostgres-9.1、特にこのサイトから使用することについて学びました。postgresql書き込み可能な共通テーブル式同時実行性

WITH upsert as 
(update mytable2 m set sales=m.sales+d.sales, status=d.status from mytable d where m.pid=d.pid 
    RETURNING m.* 
) 
insert into mytable2 select a.pid, a.sales,'NEW' from mytable a where a.pid not in (select b.pid from upsert b); 

http://vibhorkumar.wordpress.com/2011/10/26/upsertmerge-using-writable-cte-in-postgresql-9-1/は、私はいくつかの同僚にこのことを言及し、私はこのような操作を行う際に使用したpostgresに同時実行モデル/安全性について尋ねました。私の最初の考えは、mytableがすべての状況でスレッドセーフであるように、ステートメントの実行全体に対してロックされるということでした。

これは正しい仮定ですか?私はpostgresのステートメント実行の内部同時実行モデルについては何も知らない。しかし、誰もが望むように詳細にしたい場合、それは素晴らしいでしょう=]

答えて

1

PostgreSQLはMVCCを介して同時操作を処理するので、基本的なCRUD操作はロックされません。

トランザクションは、開始前にコミットされたデータのみを表示します。実行中は、外部で発生した変更については通知されません。つまり、独自の変更のみが表示されます。

他のプロセスがデータを並行して変更しないようにする場合は、明示的なロックを設定する必要があります。

良い読み出しがドキュメントである:http://www.postgresql.org/docs/current/static/mvcc-intro.html

+1

その文が希望アップサートを実行するか、重複キーエラーで失敗するかのようにそれは私には見えます。エラーの場合、要求されたアクティビティーの* none *が保持されるため、重複キー・エラーの再試行は安全です。 – kgrittn

関連する問題