为了处理乐观并发,我需要在我的数据集 C# 客户端中做什么?
除了使用时间戳之外,本文不会详细介绍
假设您自己处理这一切。
如果您最初从数据库中检索的时间戳小于当前保存在对象上的时间戳,那么其他人已经保存了数据,您不应该允许当前用户保存,或者至少提示他们他们可能正在覆盖更改。
如果没有更详细的问题,我真的不知道还能说什么。
为了处理乐观并发,我需要在我的数据集 C# 客户端中做什么?
没有。处理此问题的不是数据集的 jkob - 数据集是数据的离线缓存。根据数据集中提供的信息,将更改写入数据库以处理乐观并发是您使用的任何工作。
数据集根本不处理数据库交互。
除了使用时间戳外,本文不会详细介绍
这不是很正确,文章只是提到了时间戳(前半部分或文章中的用例),或者提供了关于第二个乐观锁实现的更多细节——
测试乐观并发违规的另一种技术是验证行中的所有原始列值是否仍与数据库中的值匹配
魔术是由以下语句执行的:
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
如果更新了零行,那么您将了解并发异常并相应地报告。