2012-03-22 8 views
2

は、私はこのような何かをしたい:がいない場合、つまりPostgreSQL - トランザクションはアトミック性を保証しますか?

SELECT * FROM TABLE where *condition* 
... TEST for a row being returned 
IF NOT 
    INSERT the row 

は、私が唯一のテーブルに行を挿入したいです。私の懸念は、私が結果セットをテストしている間、その行は実際に別のプロセスによって挿入される可能性があるということです。私はこれを知らないだろうし、2つの行が挿入されます。私はこれが起こることを望んでいない。

トランザクションで2つのステートメントをラップすることを考えましたが、これは答えではないと思われます。トランザクションが実行されている間にテーブルをロックするのと同じような効果があるかどうかは分かりません。したがって、SELECTとINSERTの間に他の挿入を防止できますか?これが問題です。

私はそれを行う最良の方法は、行の列に一意のキーを設定し、重複する挿入を防ぐことだと思う。しかし、私はトランザクションを使用することについての私の考えがすべて有効であるか激変しているのかまだ疑問に思いますか?

答えて

5

データベースはアトミック性を保証します。しかし、これはあなたに役立つものではありません。 DBは、一連の操作を完全に実行するか、まったく実行しないかのいずれかだけです。

これは、DBの人々は、常に程度ACIDた意味話をする理由、次のとおりです。あなたがリンクされウィキペディアを読んでください

  • 不可分
  • 一貫
  • 分離
  • 耐久性

をまた、PostgreSQLマニュアルのTransaction Isolationの章、whiまた、PostgreSQLの文脈ですべてのことを説明しています。

ああ、基本的にはACIが必要です。ユニークなインデックスを使用したくない場合は、挿入する前にテーブル全体をテーブルロックする必要があります。 インデックスは最もシンプルで強力なソリューションです。

関連する問題