2

これにより、MySQL (InnoDB) との競合状態が発生しますか?

  1. 取引開始。

  2. レコードを取得してみてください。

  3. レコードが存在しない場合は、戻ります。

  4. レコードが存在する場合は、それを削除し、削除されたことを示すログ エントリを追加します。

  5. トランザクションの終了 (コミット/ロールバック)。

2b の削除ステップの直前に別のプロセスを開始し、レコードの存在を検出してから、両方のプロセスに項目削除エントリをログに入力させることは可能ですか?

私が取る必要がある予防措置はありますか?

ありがとう。

4

4 に答える 4

4

ステップ2で「select for update」を使用します。1つのプロセスのみが行のロックを取得できるため、説明したシナリオを回避できます。

于 2009-04-27T20:57:21.620 に答える
1

取引開始。

レコードを削除 /* 「レコードの取得を試みる」の場合とまったく同じ基準を使用して */

応答がレコードが実際に削除されたことを示している場合は、ログ エントリを追加します。

トランザクションの終了 (コミット/ロールバック)。

競合状態はもうありません。

于 2010-08-19T15:52:51.427 に答える
0

はい、テーブルを読み取った後、別のトランザクションがテーブルをチェックする可能性があります。

さらに悪いことに、トランザクションの仕組みにより、行を削除した後でも、まだ削除をコミットしていないため、開始された新しいトランザクションには行が表示されます。

SELECT ... FOR UPDATE防ぐ方法の一つです。

LOCK TABLE tablename別のものです。

残念ながら、あなたは ORM を使用しているため、これらのいずれかを実行できるかどうかはわかりませんでした。

于 2009-04-27T21:16:23.433 に答える