複数のエージェントがテーブルから顧客を1つずつロードするC#でコールセンタープログラムを作成しています。複数のエージェントが同じ顧客をロードするのを防ぐために、テーブルに新しいフィールドを追加して、その行がロックされていることを示しました。行を選択すると、その行が更新され、その行を選択したエージェントのIDにロックフィールドが設定されます。しかし問題は、私が行を選択してロックしている間に、別のエージェントがまだロックされていないので同じ行を選択することができます!このような状況に対応できる方法はありますか?データベースは、MySQL 5/InnoDBの更新が行われる前に他のセッションが行を選択しないようにする方法
0
A
答えて
1
はあなたが唯一のエージェントにつき1つのプロファイルをロックすることができますと仮定している:私は、アップデートを実行する前に、私はIDを選択する必要が
--Check for no lock
UPDATE T SET LockField = 'abc' WHERE ProfileId = 1 AND LockField IS NULL;
--Check to see if we updated anything.
--If not, we can't show this row because someone else has it locked
SELECT ROW_COUNT();
...
1つのステートメントでUPDATEを実行すると、そうではありません。私はMySQLの構文について私の知るところを少し過ぎていますが、次のようなものです:
--Check for no lock
UPDATE T SET LockField = 'abc' WHERE ProfileId = (
SELECT ProfileId FROM T WHERE LockField IS NULL LIMIT 1
);
--Check to see what we updated
SELECT * FROM T WHERE LockField = 'abc';
かなり簡単に動作します。
あなたはもう少し複雑に取得したい場合(またはMySQLのサブクエリをサポートしていません)、あなたは、SELECT ... FOR UPDATEで更新ロックを使用することができます。
START TRANSACTION;
--Put an update lock on the row till the xaction ends
--any other SELECT wanting an update lock will block until we're out of the xaction
SELECT @id = ID FROM T WHERE LockField IS NULL LIMIT 1 FOR UPDATE;
UPDATE T SET LockField = 'abc' WHERE ID = @id;
COMMIT TRANSACTION;
0
はLOCK TABLES
とUNLOCK TABLES
をチェック:
http://dev.mysql.com/doc/refman/5.6/en/lock-tables.html
あなたはマークの答えと一緒にこれを使用することができます。
0
関連する問題
- 1. SelectionChanged選択が行われる前にイベントが発生する
- 2. EntityFrameworkの更新によって変更が行われない
- 3. 選択なしで複数の行が更新される
- 4. 新しい行を選択すると、リストビューの行が選択されたままになる
- 5. 新しいUITextFieldを選択するとUIPickerViewの行が更新されます
- 6. 行選択の代わりにセル選択を行う方法dojo DataGrid?
- 7. jquery ui autocomplete:選択が行われるまで選択リストを開いたままにする方法
- 8. は、オートリストビューで選択した行を更新する方法後
- 9. EditorGridで選択した行をユーザーが変更できないようにする方法
- 10. UITableviewで選択された行と選択されていない行の色を変更する方法は?
- 11. NHibernateの更新により、行の計算カラムが選択される
- 12. MySQL - 行が選択されるたびにビュー列が更新されます
- 13. アプリケーション更新ファイルのファイルが解凍される前にWebSphereが起動しないようにする方法
- 14. PHPデータベースの更新が正常に行われない
- 15. 挿入/更新が選択されていても、バイパス検証が行われない
- 16. 他のリンクテーブルの行が更新されたときにタイムスタンプを自動的に更新する方法
- 17. 行のランダムなFIELDを選択し、それに応じて更新する
- 18. JPA @ManyToMany作成時に更新が行われない
- 19. MySQL:ランダムに選択された行の50%を更新するにはどうすればよいですか?
- 20. スウィングでリスト選択が行われていない
- 21. 方法タブの行を含むJTabbedPaneが選択されたときに行の順序を変更しないようにしますか?
- 22. 行を選択するときに列を更新するにはどうすればよいですか?
- 23. プロパティ選択の変更後にプロパティビューが更新されない
- 24. フィールドを選択的に更新する(更新しない)
- 25. JQuery:リンクが行われる前に投稿を実行する
- 26. 列に文字列が含まれている行を選択する方法
- 27. DBGrid:行が選択されないようにするにはどうすればいいですか?
- 28. 名前属性が推奨されていない場合、ラジオボタンを排他的に選択する方法?
- 29. 他のテーブルで一致する行の行を選択する方法
- 30. キャッシュされた特定のページがアプリケーションキャッシュの更新を行わないようにする
あなたは「テーブルから1つずつ」 - どの基準に基づいて書きますか?一番長い間テーブルの中にいたのは? – MiMo