それは、これらの「長い」タスクが実行される作業の種類によって異なります。
一般情報:
ユーザー主導のデータと 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 ミリ秒遅すぎたことをユーザーに通知します。