0

ユーザーがさまざまなオブジェクトを参照し、新しいオブジェクトを追加して保存できるサービスを実装しています。これは非常に基本的な機能です。このサービスは WCF 経由で提供され、最初に EF4 コードを使用して SQL Server データベースのデータにアクセスします。

ただし、キャッチがあります。一度に 1 人のユーザーのみが 1 つのオブジェクトで作業できるようにする特定のルールがあるため、タイトルに記載されているロック編集ロック解除動作です。

したがって、「日付 X と日付 Y の間のタイムスタンプを持つレコード」というフィルターがあるとします。これで、ユーザーはこの「フィルター」をロックし、日付 X と日付 Y の間の時間範囲の新しいレコードを追加 (注: 変更しないでください!) できる唯一のユーザーになります。

事実上無限の可能性のあるフィルターがあるため、フィルターは私がアクセスできる物理エンティティではないことにも注意してください。したがって、「更新の選択」/行ロックは不可能です(私は思います!)。また、フィルターは固定された時間範囲のステップでのみ使用できるため、フィルターの重複はありませんが、将来 (または過去) にロックできる範囲に制限はありません。

これまでのところうまくいく解決策を思いつきましたが、本当に満足していません。これをデータベースに実装するのではなく、サービスのどこかにコードを配置することを好みますが、推奨事項は大歓迎です。

  • ユーザーがロックを要求すると、最初に、フィルターに準拠し、「ロックされた」タイムスタンプが設定されているオブジェクトが既に存在するかどうかを確認します。ある場合、別のロックはできません。そうでない場合は、新しいレコードを作成して保存し、クライアントに返すためにこのレコードの「ハンドル」(何らかの ID) を取得します。それを行う前に、クエリを再度実行します。「ロックオン」タイムスタンプが設定されている時間範囲で複数のレコードを受け取った場合、たとえば最も高い ID を持つレコードが実際のロックとしてカウントされ、他のすべてのレコードは削除されます。これは特にきれいだとは思わないので、本当に使いたくありません。

  • また、WCF の operationcontract 属性を使用して、一度に 1 つの呼び出しのみを許可することも考えましたが、それも好きではありません。

4

1 に答える 1

0

ユーザーがフィルターを選択しようとするとき、または変更を保存しようとするときに、アクティブなフィルターをチェックすることをお勧めします (選択すると Ux が向上します)。アクティブなフィルターを決定するには、時間ステップがまだ使用されていないことを確認する必要があります。これは、次のように簡単に実行できます。

public static class FilterMonitor { private static Dictionary の手順 = 新しい Dictionary();

public static bool CheckActiveAddIfNew(TimeStep step)
{
    //Assumes synchronization logic
    bool isActive;
    if(!steps.TryGetValue(step, out isActive)
    {
       steps.Add(step, true);
       isActive = true;
    }
    return isActive;
}

public static bool ChangeFilter(TimeStep oldSetp, TimeStep newStep)
{
   //Synchronization code
   bool ableToChange;
   if(!CheckActiveAddIfNew(newStep))
   {
       steps[newStep] = true;
       steps[oldStep] = false;
       ableToChange = true;
   }

   return ableToChange;
}

}

ユーザーがフィルターを使い終わったら、それを解放し、必要に応じて別のユーザーがそれを取得できるようにする必要があります。これは、別のユーザーがまだ選択していない場合にのみ新しいフィルターを選択できるようにする ChangeFilter メソッドなどを介して実現できます。これにより、一度に 1 人のユーザーのみがフィルターにアクセスできるようになり、複数のユーザーが同じフィルターに追加/削除するケースを防ぐことができます。

ただし、複数のユーザーが同じ TimeRange にアクセスする必要があるが、1 人のユーザーのみがその範囲にレコードを追加/削除できるようにする場合は、ディクショナリの bool を、1 人のユーザーのみにマップされるユーザー オブジェクトに置き換えるだけです。これにより、ロジックが単純なアクティブ/非アクティブ フィルターから、アクティブで User1/非アクティブが所有するフィルターに変更されます。明らかに、その範囲にレコードを追加できるのは User1 だけです。

ご不明な点がございましたら、お知らせください。

于 2012-07-09T22:43:48.677 に答える