改变跟踪结构

时间:2009-01-06 00:16:48

标签: c# .net wpf wcf concurrency

我们希望在WCF / WPF应用程序中实现Optimistic锁定。到目前为止,我做到这一点的最好方法是实现一个通用的Optimistic,它将存储原始的副本和任何更改(因此它将存储两个副本:原始和修改)的任何值对象,可以是改性。这是最好的方式吗?

例如:UserVO将被通用包装为乐观。当对Optimistic进行更改时,将对存储在Optimistic中的修改副本进行更改,同时存储在Optimistic中的原始文件将保持不变。主要问题似乎是它占用了两倍的空间,从而占用了带宽。

由于

编辑解决方案需要独立于数据库,能够为每个值对象指定冲突解决策略是有用的。 (例如,如果未更改更新的行,则用户对象可能会尝试合并,但事务对象始终需要用户干预)。

3 个答案:

答案 0 :(得分:0)

如果您使用的是SQL Server,则可以使用timestamp列。每次修改行时都会更改时间戳列。基本上,当您更新数据库时,您可以检查时间戳列是否与客户端首次获取数据时相同,如果是,则没有人修改数据。

修改

如果要最小化带宽,可以通过在每个对象上添加版本号来模拟时间戳概念。例如:

  1. 客户端1请求对象,服务器返回对象V1
  2. 客户端2请求对象,服务器返回Object v2
  3. 客户端1修改将对象作为V1
  4. 发送回服务器的对象
  5. 服务器比较版本并查看v1 = v1,以便提交更改
  6. 服务器递增对象的版本,现在它的v2
  7. 客户端2 modifis对象将其作为v1
  8. 发送回服务器
  9. 服务器比较版本并查看v1!= v2,以便它执行您的策略
  10. 要配置策略,您可以在配置中定义一个特定对象,该对象将根据根对象的类型处理策略失败。您可以启动IOptomisticCheckFailurePolicy界面,您可以使用其中一个DI库(如结构图)在需要时创建对象(尽管您可以使用反射轻松加载它)

答案 1 :(得分:0)

实现乐观锁定逻辑的一种方法是将其基于行的最后修改时间戳。因此更新将如下所示:

UPDATE .... WHERE id = x AND last_updated = t

x:记录ID。 t:从数据库加载时(即修改前)行的最后更新时间戳。

请注意,必须直接或间接更新的字段之一是要设置为now(或UtcNow)的时间戳。

这样,如果在后台修改了记录,更新将失败。更新失败后,您可以发出进一步的查询以检测失败的原因。例如,

  1. 记录已被删除。
  2. 记录已被修改。
  3. 这种简单的方法提供了行级乐观锁定,它不是基于列的,也没有冲突解决方案。

答案 2 :(得分:0)

你看过Microsoft Sync Framework吗?