Эта статья не содержит подробностей, кроме использования метки времени
Это не совсем правильно, в статье просто упоминаются временные метки (вариант использования в первой половине или в статье), а в качестве альтернативы приводятся дополнительные сведения о второй реализации оптимистической блокировки -
Еще один метод проверки на наличие оптимистического нарушения параллелизма заключается в проверке того, что все исходные значения столбца в строке по-прежнему совпадают с найденными в базе данных
Магию выполняет следующее утверждение:
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
и если обновляется ноль строк, вы узнаете об исключении параллелизма и соответственно отчитаетесь.