0

私のウェブサイトにリンクされたMySqlデータベースがあり、タスクリストのテーブルがあります(列は以下の「/」で区切られています)。

task1 / doTask1.sh / todo

task2 / doTask2.sh / 完了

task3 / doTask3.sh / todo

task4 / doTask4.sh / todo

等...

私のウェブサイトへのすべてのリクエストで、「todo」タスクが実行され、サーバーによって「完了」としてマークされるようにします。タスクは 1 回だけ実行できます。しかし、ここで問題が発生します。

仮に:

ユーザー A は、「todo」としてマークされたタスクを選択します。doTask1.sh が実行され、ユーザー A からの要求によってトリガーされ、完了としてマークされます。ユーザー B は、「todo」としてマークされたタスクを選択します (タスク 1 が完了したため、タスク 3 とタスク 3 のみ)。doTask3.sh が実行され、ユーザー A からの要求によってトリガーされ、完了としてマークされます。ユーザー B からの要求によってトリガーされ、doTask3.sh が再度実行されます。doTask4.sh についても同様です。

これは、同時 DB 接続により、PHP/Nginx/MySql を使用して発生する可能性がありますか? はいの場合、どうすればこの問題を回避/回避できますか?


この例では、状況を単純化するために doTaskx.sh を使用しました。実際には、この列にはタスクの説明が含まれており、私の Web サイトを強化する PHP スクリプトは、その説明に応じてタスクを実行します。

4

2 に答える 2

1

はい、これは起こりえます。

この問題を解決するための 1 つの方法は、次のことです。

  • 「保留中」ステータスを作成します。
  • タスクを実行するリクエストが届いたら、ID と status = "todo" が "pending" に一致するすべてを設定して、データベースで更新を実行します。
  • 更新されたレコードの数が 1 の場合、タスクを実行し、「完了」としてマークします。
  • 更新されたレコードの数が 0 の場合、別の要求が最初に到達したことを意味します。
  • いずれにせよ、ユーザー インターフェイスを更新して、タスクが保留中または完了していることを示します。
于 2012-06-09T17:04:38.343 に答える
0

リストをロックします。要求されたまだやるべきタスクを取得し、それらを「進行中」としてマークし、ロックを解除してから、タスクを実行するものに渡します。

于 2012-06-09T17:00:07.547 に答える