2016-07-06 12 views
0

私は、アトミックなデータベース操作を実行する必要がある分散システムを持っています。本質的に、アプリケーションはfind or createを実行する必要があります。分散ロックと制御フローの制約違反例外処理

私は2つのオプションを考えることができます。操作は、プロセス/システム間でアトミックであることを保証するために、分散ロックを使用してください)

A。レコードが存在するかどうかを確認します。それに応じてレコードを取得または作成します。

B)必ずレコードを挿入してください。データベースに一意の制約違反エラーを発生させ、アプリケーションで例外をキャッチします。例外が発生した場合は存在するので、代わりにレコードを取得します。

オプションAのように見えます。は、確かにですが、よりパフォーマンスが優れていますか?

コントロールフローの例外処理を使用するのは臭いですが、本当にひどいですか?私はオプションBの方が読みやすく、推論しやすいと感じています。さらに、データベースにロックを必要としません。

具体的な理由で私に具体的な理由を教えてもらえますか具体的な証拠をもってオプションBを使用することはできますか?

ありがとうございます!

答えて

1

ロックは明らかにコストがかかります。たとえプロセスが取得しようとしている間にブロックされていなくても、管理には時間とリソースがかかります。

私が知る限り、例外を発生させることは、以前に挿入されたデータのロールバックを引き起こさない限り、例外ではありません(テーブルの拡張と自動バキュームの作成)。

しかし、Postgres 9.5では、同じことを臭いなしでINSERT ... ON CONFLICT DO NOTHING文を使って行うことができます。あなたのクライアントライブラリは、影響を受ける行の数を返す必要があります。INSERTが成功したかどうかがわかります。

+0

このリンクをお寄せいただきありがとうございます。私はpostgres upsertについて読んだが、私はdo nothingを考えなかった。 洞察をいただきありがとうございます。 –