更改跟踪结构

问题描述:

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

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

感谢

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

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

编辑

如果你想带宽最小化,你可以通过每个对象上添加一个版本号效仿时间戳的概念。因此,例如:

  1. 客户端1个请求对象,断绝返回对象V1
  2. 客户端2个请求对象,服务器返回Object V2
  3. 客户端1次修改对象发送回服务器作为V1
  4. 服务器比较版本和看到的V1 = V1因此它承诺
  5. 服务器递增对象的版本所以现在它的V2
  6. 客户端2个modifis对象发送回服务器为V1
  7. 变化
  8. 服务器版本进行比较,看的V1!= V2所以它执行任何你的政策是

用于配置策略,您可以在配置取决于根的类型,定义一个特定的对象,将处理政策失败目的。你可以打开一个IOptomisticCheckFailurePolicy接口,你可以在结构图的时候使用其中的一个DI库来创建对象(尽管你可以使用反射来轻松地加载它)

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

UPDATE .... WHERE ID = X和LAST_UPDATED = T

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

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

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

  1. 记录已被删除。
  2. 记录已被修改。

这种简单的方法提供了行级乐观锁定,它不是基于列的并且没有冲突解决。

+0

如果您使用MS SQL使用时行修改时间戳列其全自动改变时间戳。 – JoshBerke 2009-01-06 00:46:01

有你看了Microsoft Sync Framework