1

私はAJAXアプリケーションに取り組んでいます。ユーザーがボタンをクリックすると、ユーザーの名前がデータベースに保存され、<div> 内に表示されます。このコンテンツは、AJAX ロング ポーリングによってデータベースから取得されます。データベースには、有効期限を表すタイムスタンプも含まれています。そのタイムスタンプを超えるサブスクリプションは受け付けてはなりません。ユーザーが購読することにも制限があります。

AJAX 要求によって呼び出される PHP スクリプトがあります。このスクリプトはデータベースにクエリを実行し、有効期限をチェックします (クリックのタイムスタンプは JavaScript によって計算され、AJAX 経由で送信されます)。また、ユーザー制限もチェックします。ユーザーと製品 (サブスクライブする) の間に N 対 N の関係があります。これらのタスクには明らかに時間がかかり、並行性の問題が発生する可能性が心配です。データベース トランザクションを使用する必要がありますか? この操作の原子性を確保するには、どのような手法を使用できますか?

4

1 に答える 1

2

それは、これらの「長い」タスクが実行される作業の種類によって異なります。

一般情報:

ユーザー主導のデータと PHP で生成されたデータのみを挿入し、DB からフェッチされたデータとの読み取りや相互相関を行わない場合、トランザクション性は問題になりません。

データを更新し、DB 内の他の要素と相互相関させる場合は、トランザクションの使用を開始し、使用する予定のトランザクションの分離レベルを慎重に選択する必要があります。

同時実行性が高まると、トランザクションは速度に深刻な影響を与える可能性があります。非常に安全な分離レベルを選択すると、アプリケーションにとって必要以上に安全になる可能性があり、MVCC に多くの不要な作業を追加する可能性があります。

また、トランザクションを個別の PHP API 呼び出しとして使用し、アプリケーションでロールバック ロジックを管理すると、PHP によって生成されるすべての処理遅延が追加されるため、トランザクションの全体的な所要時間が長くなります。DB 通信を 1 回の通信で要求される一連のクエリにコンパクト化できれば、よりよいでしょう。

ケース情報:

このシナリオを考えてみましょう: 8 つのスロットがあり、7 人のユーザーがサブスクライブしています。2 人のユーザーがほぼ同時に購読ボタンをクリックします。最後にクリックしたユーザーに対して制御スクリプトが起動されると、最初にクリックしたユーザーのサブスクリプションのクエリが引き続き実行される場合があります。これは、システムが両方のユーザーを有効なサブスクリプションとして受け入れることを意味します。

これは、私が説明した 2 番目のケースに当てはまります。つまり、ユーザー主導のデータを DB にあるデータと相互相関させている場合です。ユーザードライブデータをコミットする前にデータベースの状態を読み取っているので、この場合はトランザクションが必要になります。

1 つの更新ステートメントの固有の原子性を推測する可能性があるかもしれません。AnyUPDATE table_name SET x = x+1 WHERE a = 'value';はアトミックであることが保証されています。これを有利に利用できます。

サブスクライブしているすべての PHP スレッドは、最初にサブスクライバー数を減らす必要があります。減少の影響を受けた行数が 0 でない場合、減少が成功したことを意味し、ユーザー関連データの送信を続行できます。それ以外の場合は、0.3 ミリ秒遅すぎたことをユーザーに通知します。

于 2012-07-24T13:44:30.523 に答える