MySQL の競合状態
-
18-09-2019 - |
質問
これにより、MySQL (InnoDB) との競合状態が発生しますか?
トランザクションを開始します。
記録を取得してみてください。
レコードが存在しない場合は戻ります。
レコードが存在する場合は、それを削除し、削除されたことを示すログ エントリを追加します。
トランザクションを終了します (コミット/ロールバック)。
2b の削除ステップの直前に別のプロセスを開始し、レコードの存在を検出して、両方のプロセスに項目削除エントリをログに入力させることは可能ですか?
何か注意すべきことはありますか?
ありがとう。
解決
一つだけのプロセスは、このようにあなたが説明したシナリオを回避行のロックを取得することができますステップ2で「アップデートを選択」を使用します。
他のヒント
職人プログラマは、私は信じて、正しい解決策を持っています。あなたが壊れたORMツール(アップデートを照会することはできません1)を使用している示してきたので、私はあなたが重複を避けることができますので、あなたが削除操作のトリガーにログテーブルにあなたのINSERTを移動することをお勧めしたいですエントリ。
トランザクションを開始します。
* /
「レコードを取得しよう」の使用に非常に同じ基準を使用してレコード/ *を削除します。 応答は、レコードが実際に削除されたことを示している場合、、ログエントリを追加します。
エンドトランザクション(コミット/ロールバック)。
これ以上のレースコンディションます。
はい、それはあなたがそれを読んだ後にテーブルをチェックするために別のトランザクションのために可能です。
あなたはまだコミットしていないので、さらに悪いことには、理由の取引がどのように動作するかの、あなたが行を削除した後でも、開始新しいトランザクションが行が表示されます削除ます。
SELECT ... FOR UPDATE
はそれを防止するための一つの方法です。
LOCK TABLE tablename
は別です。
あなたはORMを使用しているので、残念ながら、私はそれがこれらのいずれかを行う能力を有しているかどうかを言うことができませんでした。