我们希望在WCF / WPF应用程序中实现Optimistic锁定。到目前为止,我做到这一点的最好方法是实现一个通用的Optimistic,它将存储原始的副本和任何更改(因此它将存储两个副本:原始和修改)的任何值对象,可以是改性。这是最好的方式吗?
例如:UserVO将被通用包装为乐观。当对Optimistic进行更改时,将对存储在Optimistic中的修改副本进行更改,同时存储在Optimistic中的原始文件将保持不变。主要问题似乎是它占用了两倍的空间,从而占用了带宽。
由于
编辑解决方案需要独立于数据库,能够为每个值对象指定冲突解决策略是有用的。 (例如,如果未更改更新的行,则用户对象可能会尝试合并,但事务对象始终需要用户干预)。
答案 0 :(得分:0)
如果您使用的是SQL Server,则可以使用timestamp列。每次修改行时都会更改时间戳列。基本上,当您更新数据库时,您可以检查时间戳列是否与客户端首次获取数据时相同,如果是,则没有人修改数据。
如果要最小化带宽,可以通过在每个对象上添加版本号来模拟时间戳概念。例如:
要配置策略,您可以在配置中定义一个特定对象,该对象将根据根对象的类型处理策略失败。您可以启动IOptomisticCheckFailurePolicy界面,您可以使用其中一个DI库(如结构图)在需要时创建对象(尽管您可以使用反射轻松加载它)
答案 1 :(得分:0)
实现乐观锁定逻辑的一种方法是将其基于行的最后修改时间戳。因此更新将如下所示:
UPDATE .... WHERE id = x AND last_updated = t
x:记录ID。 t:从数据库加载时(即修改前)行的最后更新时间戳。
请注意,必须直接或间接更新的字段之一是要设置为now(或UtcNow)的时间戳。
这样,如果在后台修改了记录,更新将失败。更新失败后,您可以发出进一步的查询以检测失败的原因。例如,
这种简单的方法提供了行级乐观锁定,它不是基于列的,也没有冲突解决方案。
答案 2 :(得分:0)