2009-04-23 11 views
4

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

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

他の方法はありますか?

ところで、データベースのバックエンドとしてMySQLを使用しています。すべての状態は、(中央)データベースにある場合

+0

同時に複数の要求がデータベースサーバーにアクセスしようとしています。彼らは別のサーバー上にあるということはあまり変わっていません。 – jfclavette

+0

OKでも、同時に複数のレコードに影響します。最初の要求がまだ実行中のときに、同じレコードに影響を与える別の要求はありません。簡単に言えば、C#ではlockキーワードのようなものを使いたいが、分散して動作させたい。 –

答えて

1

は、データベース・トランザクションがあなたのための世話をする必要があります。

は、あなたはこのようなZookeeperなどの分散ロッキング・サービスを調査することをお勧めしますhttp://en.wikipedia.org/wiki/Transaction_(database)

+0

私が理解する限り、トランザクションは、トランザクション内のすべてのステートメントが実行されるかどうかを保証するために使用されます。これはロックやスレッドの安全性にどのように関連していますか?トランザクションは、影響を受けるすべてのテーブル(トランザクションに関係するテーブル)をロックするか、終了するまで他のトランザクションをロック/ブロックしますか? –

2

を参照してください。これは、アプリケーション用の非常に高速な分散リソースロックコーディネーションを提供するGoogleサービスの再実装です。私はそれがウェブアプリケーションに組み込むのがどれくらい簡単か分かりません。

0

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

さらに、SOAアプローチのように、コードを単一サーバー上のサービスとして使用することもできます。

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

4

あなたの質問には、データレベルの並行性制御が含まれています。その場合は、RDBMSの並行性制御メカニズムを使用してください。

後で、データエンティティに必ずしも1対1に対応付けていないアプリケーションレベルの操作(たとえば、テーブルレコードへのアクセス)を制御したい場合は役に立ちません。一般的なソリューションには、アプリケーションレベルのセマンティクスを理解し、必要に応じてそれに応じてシリアル化するリバースプロキシサーバーがあります。 (それは負の可用性に影響を与えます。)

をそれはおそらく同様に、CAP定理にアップ読み取るために損はありません!

0

質問が古いので、それはあなたのために無関係かもしれないが、私はとにかくそれを投稿しますので、それはまだ他の人のために有用である可能性があります。あなたが実際にロック機構を実現するためのDBを使用するよう

あなたは、ロックオブジェクトの「SELECT FOR UPDATEは、」DBクエリを使用することができます。

ORMを使用している場合は、そうすることもできます。たとえば、nhibernateで行うことができます:

session.Lock(Member, LockMode.Upgrade); 
関連する問題