Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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.
Рано или поздно, из цикла вывалимся. Причем, скорее всего, очень рано...:)


Наверх

Титульная страница Поиск, карта сайта Написать письмо