![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
OnUpdateError и Paradox
Sandman25 © (2003-10-08 16:49:00)
Доброе время суток.
Я прочел, что автоинкрементные поля в Paradox часто слетают при многопользовательской работе, поэтому попытался отказаться от их использования в тех режимах, где возможна одновременная работа нескольких пользователей. Клиент толстый, сервер приложения не используется.
В чем опасность поиска максимального номера в таблице и присваивания следующего номера?
При конфликте используется
procedure TdmTables.qZakazUpdateError(DataSet: TDataSet; E: EDatabaseError;
UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction);
begin
if (UpdateKind = ukInsert) and (Pos("Key violation", E.message) > 0) then
begin
qZakazId.NewValue := qZakazId.NewValue + 1;
UpdateAction := uaRetry;
end;
end;
Sandman25 (2003-10-09 10:20:00) [1]
>Ты же не сомневаешься, что он отработает практически мгновенно.
Тоже верно.
В принципе, гибкая программа должна вести статистику конфликтов, и при накоплении некоторого критического количества повторных неудач переходить на Вашу схему. Только сомневаюсь, что так кто-то делает :)
Johnmen (2003-10-09 10:06:00) [2]
Лишний запрос, это запрос на макс.значение ключевого поля. Ты же не сомневаешься, что он отработает практически мгновенно.
Твой способ я не критикую, вполне приемлем, по-моему...
Sandman25 (2003-10-09 10:01:00) [3]
>Так и в твоем случае мучишь сервер запросом ! Просто неявно.
Да нет, я просто пытаюсь опять, без лишних запросов. В 99,9% случаев со второго раза вставка пройдет. В остальных случаях пройдет с 3-го раза.
>Кстати, а как совместим "Парадокс" с "сервером" ? :)
Я имел в виду машину, на которой находится БД. В некотором роде "сервер" :)
Johnmen (2003-10-08 23:00:00) [4]
>Sandman25 © (08.10.03 18:53)
Так и в твоем случае мучишь сервер запросом ! Просто неявно.
Кстати, а как совместим "Парадокс" с "сервером" ? :)
Sandman25 (2003-10-08 18:53:00) [5]
[3] Johnmen © (08.10.03 18:02)
Все равно, по-моему, легче иногда получать лишнюю ошибку и пытаться опять, чме каждый раз зачем-то мучить сервер вопросами о максимальном номере :)
Johnmen (2003-10-08 18:02:00) [6]
>Sandman25 © (08.10.03 17:31)
Даже если пользователей мало, но >1, то, теоретически, между п.1 и п.2 может произойти событие от другого пользователя с аналогичными желаниями...:)
Sandman25 (2003-10-08 17:31:00) [7]
[1] Johnmen © (08.10.03 17:21)
Рад, что так уже делали. А то я сделал, проверил, но уверенности не было.
Особенно учитывая, что если будет другая ошибка, возвращающая Key violation, то программа зависнет :(
Я думаю, нужно возвращаться к п.1, только если пользователей очень много. Все-таки лишний запрос к базе.
Johnmen (2003-10-08 17:21:00) [8]
В свое время был описан подход, который очень даже имеет право на жизнь. И аналогичен твоему:
1. Выполняем запрос на макс. значение ключа
2. Пихаем новую запись с макс.+1
3. Если ошибка, то к п.1.
Рано или поздно, из цикла вывалимся. Причем, скорее всего, очень рано...:)