特にこのサイトから、postgres-9.1 で書き込み可能な共通テーブル式を使用することについて学びました。http://vibhorkumar.wordpress.com/2011/10/26/upsertmerge-using-writable-cte-in-postgresql-9-1/
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);
このことを何人かの同僚に話したところ、postgres がこのような操作を行う際に使用する同時実行モデル/安全性について尋ねられました。私が最初に考えたmytable
のは、ステートメントの実行全体でロックされるため、すべての状況でスレッドセーフになるということでした。
それは正しい仮定ですか?postgres のステートメント実行の内部同時実行モデルについてはよくわかりません。しかし、誰かが好きなだけ詳細に行きたいのであれば、それは素晴らしいことです =]