0

ドキュメントがまったく明確にしていない counterCache について質問があります。フィールド値を更新するときに、counterCache は競合状態をチェックしますか?

たとえば、フォーラムの実装があり、フォーラムごとに、 counterCache を介してn 個のトピックが保存されているとします。次に、2 人のユーザーがほぼ同時にモデルを使用し (操作をオーバーラップするのに十分です。つまり、一方が終了しても、もう 1 人がまだそれを使用しているということです)、1 人が新しいトピックを作成し、もう 1 人が (できると仮定して) 新しいトピックを作成します。 ) 別のトピックを削除すると、 n+1またはn-1ではなく、正確にn 個のトピックが表示されますか?

4

2 に答える 2

0

最初に終了した操作が結果になります。操作が同時に行われる可能性は非常に低く、おそらく技術的に不可能です。したがって、両方のいずれかが最初に来ます。次に、サーバーとブラウザがリクエストを受信するのにかかる時間もあります。したがって、次のビュー リクエストが来るたびに、この時点でデータベースで更新されたものは何でも取得されます。

コードを確認すると、コードが +/- 1 ずつインクリメント/デクリメントするのではなく、find('count') を実行していることもわかります。http://api.cakephp.org/2.3/source-class-Model.html#1913-1981したがって、前のアクションが完了した後にキャッシュが書き込まれます。

そして最後に、特にフォーラムで、カウントが一瞬 +/- 1 ずれていても、私は本当に心配しません。

于 2013-07-23T08:33:55.140 に答える
0

私はそれが可能だと信じていますが、Cake のせいではなく、非トランザクション動作での複数の SQL 操作と、同時に複数のクライアント (ユーザー) からの操作のためです。フレームワークの有無にかかわらず、すべての Web アプリケーションがこの状況に悩まされます。

私は SQL トランザクションにあまり精通していませんが、ある種のトランザクション構成がこのフォームの発生を防いでいると確信しています。

burzum が言うように、フォーラムの例はまったく心配する必要はありません。

于 2013-08-02T18:47:00.750 に答える