1

テーブルから行を取得する2つのスクリプト/mysql接続があります。スクリプトがいくつかの行を取得すると、他のスクリプトがそれらの行にアクセスできないようにする必要があります。

私がこれまでに得たものは、これでうまくいくようです:

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
START TRANSACTION

SELECT * FROM table WHERE result='new' FOR UPDATE

// Loop over update
UPDATE table SET result='old' WHERE id=...

COMMIT

私が理解していることから、同じ接続がダーティデータを読み取ることができますが、行がロックされているため、他の接続は読み取ることができないはずです。これは正しいです?

SELECTまた、両方のスクリプトが実行されているときに各行が1回だけになることを保証するより良い方法はありますか?

編集:ああ...そしてエンジンはInnodbです

編集:また、デッドロックが実際に効果がない場合を除いて、デッドロックを回避するように努めたいと思います。デッドロックの準備をしてクエリを再実行するだけで済みます。

4

1 に答える 1

1

SELECT ... FOR UDATE行に排他ロックを設定し、ロックが解除されるのを待つことができない場合、SELECT ... FOR UDATEステートメントの主な目的は、操作中に他の人が特定の行を読み取れないようにすることです。

私があなたの質問を正しく理解した場合、「ダーティデータ」とはそれらのロックされた行を意味しますか?それらを「ダーティ」と呼ぶ理由がわかりません。ロックされているだけだからですが、実際には同じトランザクション内で、ロックした行を読み取ることができます(明らかに)。

2番目の質問について

また、両方のスクリプトが実行されているときに各行が1回だけSELECTになることを保証するより良い方法はありますか?

SELECT ... FOR UDATE各瞬間に特定の行が1つのトランザクション内でのみ読み取れることを保証します。この声明がその目的のために特別に設計されたとたんに、私はそうするためのより良い方法を見ません。

于 2012-08-22T06:45:45.633 に答える