1

次の SQL 疑似コードがあるとします。

... open transaction ...
SELECT * FROM users WHERE users.id = 5
... some calculation here ...
INSERT INTO users (id) VALUES (5)
... commit transaction ...

REPEATABLE_READ 分離は、同時接続Users[id=5]がクエリと挿入の間に挿入されるのを防ぐために保証されていますSERIALIZABLEか、それとも分離を使用する必要がありますか?

:可能であれば、データベースに依存しないソリューションを探しています。そうでない場合は、業界の何らかのコンセンサスに反するように、複数のデータベースから経験的な証拠を提供してください。

UPDATE : 元の質問には、範囲ロックを利用した誤ったクエリが含まれていました。この質問の目的は、範囲ロックを必要としないクエリに焦点を当てることであるため、質問を更新しました。

4

2 に答える 2

2

いいえ。分離レベルは、同じトランザクション内でREPEATABLE_READを繰り返した場合に同じデータが表示されることのみを保証します。つまり、(SQL) 実装は、他のトランザクションによって実行されるトランザクション挿入から隠される可能性があります。SELECT

挿入を排除できる唯一の分離レベルはSERIALIZABLE、複数のトランザクションが同時に動作している場合、それらが特定の順序で順次実行されたかのように結果が保証されるためです。それぞれの場合の特定の順序は指定も報告もされていませんが、同じ最終結果を生成する順序が存在することが保証されています。

質問の条件の 1 つはデータベースに依存しない (そして私は高レベルの回答を想定している) ため、さまざまな分離レベルがさまざまな DB 実装でどのように機能するか、またはそれらがロックにどのように変換されるかについては言及しません。

于 2013-09-02T10:31:22.983 に答える