0

私は職場でWebチケットシステムを開発し、奇妙な問題に直面しました。

発生したすべてのチケットはmysqlテーブルに保存されます。開いているチケットは、「割り当てられた」列によって識別されます。「false」は、割り当てられていないチケットのデフォルト値です。次に、エンジニアがWebページの[チケットを取得]ボタンをクリックすると、優先度に基づいてチケットがエンジニアに割り当てられます。

ツールは完璧に機能しましたが、過去2〜3日間、チケットフローが増加したため、2〜3人のエンジニアが[チケットを取得]ボタンを同時に押して、全員に同じチケットが割り当てられる場合があります。

誰かがそのようなバグを回避するための最良の方法を教えてくれますか?

データベースをロックしようとしましたが、機能しませんでした。MySQLトランザクションを探していますが、アプリケーションの速度が低下する可能性があると思います。

何か提案を手伝ってください!

4

3 に答える 3

1

トランザクションを使用する必要があります。データベース環境でのトランザクションは、データベースに同時にアクセスするプログラム間の分離を提供します。この分離が提供されていない場合、プログラムの結果は誤っている可能性があります。

于 2013-03-26T11:01:59.770 に答える
1

PHPコードでMySQLトランザクションを使用する必要があります

便利なリンクPHP+MySQLトランザクションの例

于 2013-03-26T11:07:34.140 に答える
1

データベース構造にが含まれている場合

  • チケットの一意の識別子
  • 「割り当てられた」フラグ
  • ユーザーIDの「assigned_to」列
  • チケット作成タイムスタンプおよび/またはチケット更新タイムスタンプ

この問題は、アトミック更新と更新の制限句を使用して修正できます。

UPDATE  tickets
    SET
        assigned = TRUE,
        updated_at = NOW(),
        assigned_to = @current_user_id
    WHERE assigned = FALSE
    LIMIT 1;

次に、以下を選択して、現在のユーザーIDにすでに割り当てられているオープンチケットを「取得」できます。

SELECT *
    FROM tickets
    WHERE assigned_to = @current_user_id
    ORDER BY updated_at DESC
    LIMIT 1;

これは、更新句のアトミックな性質を利用します。更新作業には、複数のステートメントに分割する必要がないため、トランザクションの必要はありません。

更新がより複雑で、さまざまな場所からデータを選択して後で更新として作成する必要がある場合は、もちろんトランザクションが必要になります。

于 2013-03-26T11:13:28.523 に答える