0

特にこのサイトから、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 のステートメント実行の内部同時実行モデルについてはよくわかりません。しかし、誰かが好きなだけ詳細に行きたいのであれば、それは素晴らしいことです =]

4

1 に答える 1

1

PostgreSQL は MVCC を介して同時操作を処理するため、基本的な CRUD 操作がロックされることはありません。

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

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

よく読んだドキュメントは次のとおりです。 http://www.postgresql.org/docs/current/static/mvcc-intro.html

于 2012-04-19T19:47:13.737 に答える