ユーザーがさまざまなオブジェクトを参照し、新しいオブジェクトを追加して保存できるサービスを実装しています。これは非常に基本的な機能です。このサービスは WCF 経由で提供され、最初に EF4 コードを使用して SQL Server データベースのデータにアクセスします。
ただし、キャッチがあります。一度に 1 人のユーザーのみが 1 つのオブジェクトで作業できるようにする特定のルールがあるため、タイトルに記載されているロック編集ロック解除動作です。
したがって、「日付 X と日付 Y の間のタイムスタンプを持つレコード」というフィルターがあるとします。これで、ユーザーはこの「フィルター」をロックし、日付 X と日付 Y の間の時間範囲の新しいレコードを追加 (注: 変更しないでください!) できる唯一のユーザーになります。
事実上無限の可能性のあるフィルターがあるため、フィルターは私がアクセスできる物理エンティティではないことにも注意してください。したがって、「更新の選択」/行ロックは不可能です(私は思います!)。また、フィルターは固定された時間範囲のステップでのみ使用できるため、フィルターの重複はありませんが、将来 (または過去) にロックできる範囲に制限はありません。
これまでのところうまくいく解決策を思いつきましたが、本当に満足していません。これをデータベースに実装するのではなく、サービスのどこかにコードを配置することを好みますが、推奨事項は大歓迎です。
ユーザーがロックを要求すると、最初に、フィルターに準拠し、「ロックされた」タイムスタンプが設定されているオブジェクトが既に存在するかどうかを確認します。ある場合、別のロックはできません。そうでない場合は、新しいレコードを作成して保存し、クライアントに返すためにこのレコードの「ハンドル」(何らかの ID) を取得します。それを行う前に、クエリを再度実行します。「ロックオン」タイムスタンプが設定されている時間範囲で複数のレコードを受け取った場合、たとえば最も高い ID を持つレコードが実際のロックとしてカウントされ、他のすべてのレコードは削除されます。これは特にきれいだとは思わないので、本当に使いたくありません。
また、WCF の operationcontract 属性を使用して、一度に 1 つの呼び出しのみを許可することも考えましたが、それも好きではありません。