私たちはMySQL InnoDBを使用しています。同時に発生する複数の要求をサポートします。 ここでは、達成しようとしているものの簡略化した例を示します。 電球を表すエンティティを保持するテーブルがあるとします。これらの電球は、ユーザによってオン(作動)することができる。ユーザーはテーブルに電球を追加することができます。電球は最初は無効化されており、そのうち10個だけが有効化としてマークされます。MySQL InnoDBの競合状態を回避する方法は?
セッション1:
1:だから我々は、システムが同時実行をサポートしているので、10の制限は、次の例に基づいて、競合状態の危険がある持っているアクティブな電球の数を取得
2:起動した電球の数を確認してください
3:制限に達していない場合は、電球を作動させて確定してください。
4:そうでなければロールバックします。
ここで問題となるのは、ステップ2と4の間に別のセッションが入る可能性があり、上限を超えてしまう可能性があるということです。
は、これは私たちが現在何をしているかのSQL表現である:
- SELECT COUNT(ID)TBLからの総AS WHERE 1 = is_active。
- if(合計< 10){
- 別の球を活性化する。 } else {
- ロールバック; }
このシナリオでは、どのような解決策をお勧めしますか? 「選択更新」を検討していましたが、誤解がなければ選択した行をロックし、選択した行がロックされている間にユーザーがテーブルに電球を追加できます。
ありがとうございます。行があなたは制限が満たされている知っている更新しない場合
update active_bulb_count
set active_count = active_count + 1
where active_count < limit
and <any other conditions needed>;
:
電球を「アクティブにする」必要がありますか、まったく何もしませんか?彼はもはや「活性化」できないことをユーザーに知らせることに注意してください。 (私は問題の声明が不完全であると感じています。) –