同時に複数のスレッド間でのトランザクションの同時実行性の問題。 。
複数のスレッドがトランザクション A を同時に実行しています。 。
トランザクション A にステップ 1 がある場合: あるテーブルの固定レコードを更新することです。 。
質問 1: テーブルの行はロックされ、スレッドは続行 (「実行」または「トランザクションの送信」) する前に、前の行がトランザクションを送信するまで待機する必要がありますか?
トランザクション A にはステップ 2 があります。これは、特定のテーブルに対して INSERT レコードを実行することです。
トランザクション A が送信される前に、ステップ 3 があります。ステップ 2 のデータを比較します。 INSERT レコードが要件を超えている場合は、ロールバックしてください。 。
質問 2: 質問 1 の答えがトランザクションをコミットすることである場合、同時実行が発生した場合、ステップ 3 は役に立たず、検出不可能ですか?答えが実行である場合、同時実行を防ぐことができますか?
質問 3: 問題 2 が解決できない場合、ステップ 2 でレコードを INSERT する前に、このテーブルに対して SELECT FOR UPDATE を実行して行をロックする必要がありますか?これで同時実行の問題は解決されるはずですが、他に方法はありますか?
誰かが私に指導してくれることを願っています、ありがとう。 。 。
-----解決策---------
質問 3: 質問 2 が解決できない場合、手順 2 でレコードを INSERT する前に、このテーブルに対して SELECT FOR UPDATE を実行して行をロックする必要がありますか?これで同時実行の問題は解決されるはずですが、他に方法はありますか?
上では何も言いませんが、この問題が重要です。 更新のためにロックする必要があります。この方法でのみアトミック性が保証されます:
1, query A
2 。 A は条件を満たしており、A を更新します
1 と 2 がアトミックでない場合、A のクエリと A の更新の間に、A を変更する他の操作が発生します。どうすればよいですか? 1と2を全体的にロックするだけです。特にinnodbは行をロックできるので、テーブルを直接ロックするよりも使いやすいです。