0

現在、PHP ベースがあり、その中でユーザーは自分のアカウントにログインできます。私たちのサイトは非常に大きく、開発者は各ユーザーに利益をもたらすために任意の量のデータを保存する方法を望んでいます (そのため、ユーザーがページに入力したものである可能性があり、ユーザーがそれを行ったという事実に基づいて、異なる値でページを読み込むことができます)。彼らは戻ってきます)。

問題は、この永続的なデータを保存する最善の方法がわからないことです。最初に考えたのは、MySQL データベースのシリアル化された PHP 配列に格納することでした。これは問題なく動作しますが、ユーザーが 1 つのページを開いて配列をプルし、それを変更する必要があると判断して変更するという同時実行の問題が発生し、その間に別のタブでページが開かれていることを除いては問題ありません。配列の同じ元のコピーを取得し、別の変更が必要であると判断し、それをデータベースに書き込むため、1 つのページだけが「勝ち」、変更は失われます。ユーザーがサイトの複数のページを異なるタブで開いている可能性が非常に高い (そして現在も発生している) ため、これを考慮する必要があります。

2 番目の解決策は、最初の解決策の単なる拡張であり、更新時刻のタイムスタンプを MySQL に保存できます。開発者が配列をプルしてから配列全体が更新された場合、配列全体を再プルする必要があります。それらの変更がまだ関連していることを確認し、再送信して、新しい配列になるようにします。これはちょっと面倒に思えますが、現時点で私が持っている最良の解決策です。他にアイデアはありますか?

4

1 に答える 1

0

別の変更が発生したことを検出するためにさらにコードを記述し、ユーザーの編集を拒否するか、変更をマージしようとすることはよくあることです。

たとえば、StackOverflow がそれを行います。あなたが投稿を編集していて、他の誰かもそれを編集していて、最初に変更を保存した場合、編集を送信するとエラーが発生します。その後、投稿の新しいバージョンを再読み込みして、最初からやり直す必要があります。

変更をマージする方法はあるかもしれませんが、これは非常に注意が必要です。2 つの編集をマージした結果、相互に排他的である、または意味をなさない一連のプロパティが作成された場合はどうなりますか?

非アトミックな変更を処理する別の方法 (現在のデータを読み取ってから、変更の投稿を PHP などの言語で 2 つの別々の要求で処理する必要があります) は、編集の進行中にレコードをロックすることです。しかし、これには他の並行性の問題があります。

于 2013-11-03T11:58:54.900 に答える