使用wcf服务实现锁定/编辑/解锁

时间:2012-07-09 10:13:52

标签: c# wcf entity-framework locking

我正在实现一项服务,允许用户浏览各种对象,添加新对象然后保存它们,这是一个非常基本的功能。该服务通过WCF提供,并首先使用EF4代码访问SQL Server数据库的数据。

然而有一个问题:有一些规则应该让一个用户一次只能处理一个对象,因此标题中提到了锁定编辑解锁行为。

因此,假设有一个过滤器显示“日期X和日期Y之间的时间戳记录”。现在用户锁定了这个“过滤器”,并且是唯一能够在日期X和日期Y之间添加(注意:不修改!)时间范围的新记录的人。

值得注意的是,过滤器不是我可以访问的物理实体,因为实际上有无限的可能过滤器。因此,“选择更新”/行锁定是不可能的(我认为!)。此外,过滤器仅在固定的时间范围步骤中可用,因此过滤器没有重叠,但是您可以锁定未来(或过去)的距离没有限制。

我已经提出了一个迄今为止有效的解决方案,但我并不满意。我更喜欢在我的服务中使用代码,而不是在数据库中实现它,但欢迎任何建议:

  • 当用户请求锁定时,我首先检查是否已存在符合过滤器且已设置“锁定”时间戳的对象。如果有,则无法再锁定。如果没有,我创建一个新记录并保存它以获得该记录的“句柄”(一些id)以传递回客户端。然而,在我这样做之前,我再次运行查询,并且如果我收到多个具有“锁定”时间戳设置的时间范围的记录,则具有例如最高ID将计为实际锁定,所有其他记录将被删除。我不认为这是特别干净,所以我真的不想使用它。

  • 我还想过使用WCF operationcontract属性,一次只允许一次调用,但我也不喜欢。

1 个答案:

答案 0 :(得分:0)

我建议在用户尝试选择过滤器时,或者当他们尝试保存更改时选择检查有效过滤器(选择是为了更好的Ux)。为了确定有效过滤器,您需要确保时间步骤尚未使用,这可以很容易地完成:

public static class FilterMonitor {     private static Dictionary steps = new 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方法完成,只允许他们选择新的过滤器(如果尚未被其他用户选择)。这样可以确保一次只有一个用户可以访问过滤器,从而防止多个用户在同一过滤器中添加/删除的情况。

但是,如果您需要多个用户访问同一个TimeRange,但只希望允许单个用户在该范围内添加/删除记录,只需将“字典”中的bool替换为一个映射为一个且仅一个的用户对象用户。这将逻辑从简单的主动/非活动过滤器变为活动和非活动过滤器。由User1 / Inactive拥有。显然,只允许User1将记录添加到该范围。

如果您有任何疑问,请与我们联系。