数据集乐观并发

时间:2011-11-07 18:47:45

标签: c# sql dataset optimistic-concurrency

在我的数据集C#客户端中,我需要做些什么才能处理乐观并发?

除了使用时间戳

之外,此article不会涉及很多细节

3 个答案:

答案 0 :(得分:1)

  

除了使用时间戳

之外,本文不会涉及muy细节

这不是真的正确,文章只是提到了时间戳(上半部分或文章中的用例),或者提供了关于第二个乐观锁实现的更多细节 -

  

另一种测试乐观并发冲突的技术是验证一行中的所有原始列值是否仍然与数据库中找到的值相匹配

魔术由以下声明执行:

UPDATE Table1 Set Col1 = @NewCol1Value,
          Set Col2 = @NewCol2Value,
          Set Col3 = @NewCol3Value
WHERE Col1 = @OldCol1Value AND
    Col2 = @OldCol2Value AND
    Col3 = @OldCol3Value

所以你只是听RowUpdated事件,如果RecordsAffected为零则发生了不好的事情。

基于时间戳的实现也很明显。您将拥有日期时间以及数据集:

class OptLockDataSet { 
    DataSet _data;
    DateTime LastUpdate {
        return _data.Tables["ChangeTracker"][0][0];//just for example :)
    }
}

对于更新,您有两种方式 - 显式,当您在尝试保存任何内容之前检查时间戳时:

if(GetLastUpdateFromDB(_data) > LastUpdate ) {
    //This means that last update was changed because someone else
    //modified the data.
    //Show error to user and reload data from db.
}

或者隐含,就像本文中描述的第二种方式一样 - 尝试使用时间戳作为条件进行更新:

update data set @col1 = @val1 where last_update = @last_update

如果更新零行,那么您将了解并发异常并相应地报告。

答案 1 :(得分:0)

假设你自己处理这个问题。

如果您从数据库中检索到的时间戳最初小于当前持久存储在该对象上的时间戳,则其他人持有数据并且您不应该允许当前用户持久存在,或者至少提示他们可能会覆盖它们变化。

如果没有更详细的问题,我真的不知道还能说些什么。

答案 2 :(得分:0)

  

在我的数据集C#客户端中,我需要做些什么才能处理乐观并发?

无。它不是数据集的jkob来处理这个 - 数据集是数据的脱机缓存。无论您使用什么来将更改写入数据库,都可以根据数据集中给出的信息处理最佳并发。

数据集根本不涉及数据库交互。