Вы не упомянули, какой язык интерфейса вы используете, но вот совет из моего опыта работы с наборами данных С# и опцией «использовать оптимистичный параллелизм».
Когда вы загружаете строку в DataTable, dt отслеживает загруженные исходные значения:
SELECT id, name, age, address FROM person
--> 1, Jon, 33, null
Вы делаете обновление:
dt[0].Name = "Paul"
Строка теперь отслеживает два значения: исходное (Джон) и текущее (Пол).
Отправляя обновление обратно в базу данных, он выполняет такой запрос:
UPDATE person
SET name = @currentName
WHERE id = @originalID and
(Name = @originalName or (@originalName is null AND name is null)) AND
...
Так эффективно:
UPDATE person
SET name = 'Paul'
WHERE id = 1 and
(Name = 'John' or ('John' is null AND name is null)) AND...
Таким образом, данные, которые были изменены/обнулены/не обнулены внешним клиентом, могут быть обнаружены.
Может быть проще всего использовать ORM для вашего языка, который имеет эту возможность.
-
ps: Возможно, более простым решением для этого является добавление столбца int и триггера для его увеличения. Тем не менее, вероятно, большинству людей не нравится добавлять столбец, предназначенный исключительно для управления информацией, вместо того, чтобы моделировать некоторые аспекты реальных данных хранимого объекта.
person
Caius Jard
schedule
30.12.2017