2011-10-24 2 views
1

私はaspソリューション内で複数のsilverlightアプリケーションをボルトで接続していますが、複数のユーザーが同時に同じデータセットで同じアプリケーションを使用している可能性があります。 Silverlightアプリケーションは、データベースからデータを取り出し、ローカルで作業し、ユーザーが変更に満足すれば書き戻すように設計されています。しかし、この問題は、2人のユーザーが同じデータベース上で同じアプリケーションを使用している場合、互いの変更を上書きすることになります。テーブルのSQL Serverをロックする

多数のデータベースが存在するため、同じデータベースを一度に使用する膨大な数のユーザーはいないでしょう。複数のユーザーが同じデータセットで作業する必要はありません時間。私の考えは、単一のユーザーがサーバーへの読み取り/書き込みに排他的にアクセスできるように各テーブルをロックすることです。

どのように私はテーブルロックを適用し、それらを解放するつもりですか?私はそれが文ごとに行うことができることを知っていますが、私はこのデータに対する完全に排他的な権利を持つ必要があります。私が知ることができる問題は、ロックを解除することです。何らかのタイムアウトが必要なので、テーブルは永久に1人のユーザーにロックされません。

答えて

6

複数のウィンドウを使用する1人のユーザーや、システムでクラッシュした後に返される1人のユーザーなど、1人以上のユーザーに恐ろしい並行性の問題が発生するので、これを試行し始めることさえありません。

これに対処する簡単な方法は、タイムスタンプまたは変更カウントを持つことです。データが取得されてからタイムスタンプまたは変更カウントが変更された場合、ユーザーに他のユーザーの作業を上書きするよう警告します。その出発点からさらに進んで変更を選択し、他の人の変更を手動でコピーしたり、変更を比較させたりすることができます。

1

IMOデータベースのアーチファクト(物理的にSQLロックを使用する)や論理的に(独自のロックテーブルを使用する)問題がある可能性があります。これはアプリのスケーラビリティを制限し、同僚がコーヒーを出すときにユーザーに不満を招く可能性があります。あなたのアプリはまた、ユーザーが意図を示すアイテムをチェックアウトし、ロックを作成するように設計する必要があります(ロックをしたくない場所でデータを閲覧するのではなく)。

Multiversion concurrency controlのパターン。 一般的で非侵入的な方法は、レコードエンティティにタイムスタンプを追加し、更新を書き込む直前にレコードを再度取得し、タイムスタンプを比較して、別のユーザーがその間に変更を行ったかどうかを確認します。

0

あなたのデータベースで作業しているものは何ですか?しかし、私はテーブルでロックを使用するのではなく、私のアプリケーションで扱った同様の問題を抱えていました。

基本的に私は開いたり、編集したり保存したりできるさまざまな文書(注文や領収書など)を持っていました。私がこれらでロックを実装するためにしたのは、Type、DocID、UserID、LockedTimeのテーブルを持つことでした。 DocIDとタイプのプライマリキー(タイプはロックしようとしているもののタイプを示すので、複数のテーブルなどでこのアプローチを使用できます)

次に、ユーザーがドキュメントを開こうとすると、ドキュメントが別のユーザーにロックされているかどうかを確認するSP。ロックされていない場合は開けません。読み取り専用modfeを実装しました。ユーザーが変更を保存すると、他のユーザーが再びアクセスできるように文書のロックが解除されます。

このアプローチをあなたに使用するかどうかはわかりませんが、既存のテーブルを複雑に変更する必要がないため、実装が非常に簡単で迅速です。

関連する問題