私は、書き込み可能な共通テーブル式を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のステートメント実行の内部同時実行モデルについては何も知らない。しかし、誰もが望むように詳細にしたい場合、それは素晴らしいでしょう=]
その文が希望アップサートを実行するか、重複キーエラーで失敗するかのようにそれは私には見えます。エラーの場合、要求されたアクティビティーの* none *が保持されるため、重複キー・エラーの再試行は安全です。 – kgrittn