4

サーバー ファーム全体でタスクを同期するためのよく知られたベスト プラクティスはありますか? たとえば、サーバー ファームで実行されているフォーラム ベースの Web サイトがあり、データベース内の複数のテーブルへの書き込みが必要なアクションを実行しようとしている 2 人のモデレーターがいて、それらのモデレーターの要求がサーバー内の異なるサーバーによって処理されているとします。ファーム、ロック機能を実装して、同じアイテムに対して同時にそのアクションを実行できないようにするにはどうすればよいですか?

これまでのところ、データベース内のテーブルを使用して同期することを考えています。たとえば、テーブル内のアイテムの ID を確認して、存在しない場合は挿入して続行し、そうでない場合は戻ります。また、おそらくこれには共有キャッシュを使用できますが、現時点では使用していません。

その他の方法で?

ちなみに、データベースのバックエンドとして MySQL を使用しています。

4

5 に答える 5

4

あなたの質問は、データ レベルの同時実行制御を暗示しています。その場合は、RDBMS の同時実行制御メカニズムを使用してください。

後でデータ エンティティに必ずしも 1 対 1 でマッピングしないアプリケーション レベルのアクション (テーブル レコード アクセスなど) を制御したい場合、これは役に立ちません。一般的な解決策は、アプリケーション レベルのセマンティクスを理解し、必要に応じてシリアル化するリバース プロキシ サーバーです。(これは可用性に悪影響を及ぼします。)

CAP定理を読んでも損はないでしょう!

于 2009-05-08T12:59:28.907 に答える
1

すべての状態が (中央) データベースにある場合は、データベース トランザクションがそれを処理する必要があります。

http://en.wikipedia.org/wiki/Transaction_(データベース)を参照

于 2009-04-23T01:18:26.510 に答える
1

質問が古いため、あなたにとっては無関係かもしれませんが、それでも他の人にとっては役立つかもしれないので、とにかく投稿します.

ロックオブジェクトで「SELECT FOR UPDATE」データベースクエリを使用できるため、実際にはロックメカニズムを実現するためにデータベースを使用します。

ORM を使用している場合は、それも可能です。たとえば、nhibernate では次のことができます。

session.Lock(Member, LockMode.Upgrade);
于 2013-08-20T07:57:20.883 に答える
0

ロックのテーブルを持つことは、それを行うのに適した方法であり、簡単で機能します。

また、単一サーバー上のサービスとしてコードを使用することもできます。これは、より SOA アプローチに近いものです。

TimeStamp フィールドをトランザクションで使用することもできます。データを最後に取得してからタイムスタンプが変更された場合は、トランザクションを元に戻すことができます。したがって、最初に誰かが入った場合、その人が優先されます。

于 2009-04-23T06:59:44.147 に答える