我正在实现一个服务,让用户浏览各种对象,添加新对象然后保存它们,这是一个非常基本的功能。该服务通过 WCF 提供,并首先使用 EF4 代码访问 SQL Server 数据库的数据。
但是有一个问题:有一些规则应该让一个用户一次只能处理一个对象,因此标题中提到了锁定编辑解锁行为。
因此,假设有一个过滤器显示“时间戳在日期 X 和日期 Y 之间的记录”。现在用户锁定了这个“过滤器”,并且是唯一可以为日期 X 和日期 Y 之间的时间范围添加(注意:不能修改!)新记录的用户。
还值得注意的是,过滤器不是我可以访问的物理实体,因为实际上有无限可能的过滤器。因此,“选择更新”/行锁定是不可能的(我认为!)。此外,过滤器仅在固定的时间范围步骤中可用,因此过滤器没有重叠,尽管您可以锁定未来(或过去)的距离没有限制。
到目前为止,我已经提出了一个可行的解决方案,但我对此并不满意。我更喜欢将代码放在我的服务中,而不是在数据库中实现它,但欢迎提出任何建议:
当用户请求锁定时,我首先检查是否已经存在符合过滤器并设置了“锁定”时间戳的对象。如果有,则不可能再有一个锁。如果没有,我创建一个新记录并将其保存以获取此记录的“句柄”(一些 id)以传回给客户端。但是,在我这样做之前,我再次运行查询,如果我在设置了“锁定”时间戳的时间范围内收到多个记录,则具有例如最高 id 的记录将计为实际锁定,所有其他记录将被删除。我认为这不是特别干净,所以我真的不想使用它。
我也想过使用 WCF operationcontract 属性在任何时候只允许一次调用,但我也不喜欢这样。