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

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

Проверка на клиенте? [D7, Firebird]


Evgen ©   (2004-01-29 19:10:00) 

Уважаемые мастера Delphi помогите советом плиз...
Классическая задача:
Есть склад,
2 клиента создают одновременно расходную накладную, при этом обращаются на склад за одной и той же позицией, пока документ не создан, изменения на складе не произойдут, и другие клиенты их не увидят, но каким образом второму клиенту узнать, что первый уже выбрал для себя эту же позицию, и взял себе несколько единиц товара, но ещё не создал документ.?
таймер? Временная таблица?


Zz_   (2004-01-30 14:05:00) [1]

>>Если рукавиц на складе осталось меньше, чем запрошено в
>>документе - откатывай транзакцию

Хватай сколько есть и коммить, пока другие не увели


Reindeer Moss Eater   (2004-01-30 13:42:00) [2]

Используй оптимистичекую модель.
Перед коммитом транзакции создающий документ сохраняй в буфере клиента атрибуты документа.
Если запрошенного ресурса окажется достаточно - все ок.
Если рукавиц на складе осталось меньше, чем запрошено в документе - откатывай транзакцию и начинай новую, взяв атрибуты документа из буфера и предложив изменить запрошенное количество количество рукавиц.


Deniz   (2004-01-30 13:29:00) [3]

А если через вторую транзакцию в другую таблицу записать что-то вроде ИД будущего док-та(позже поясню для чего и откуда), ИД Товара, Кол-во, ДатаВремя блокировки(можно по default на сервере). И остатки на складе считать с учетом этой таблицы, причем определить время(например 1 час), на которое часть товара блокируется, и по прошествии этого времени, просто игнорировать запись. В это время клиент, который начал заполнять документ(часа то ему хватит?) заносит ИД будущего док-та, ИД и кол-во товара в вспом. таблицу, при удачном проводке документа снимает со склада кол-во и удаляет запись из всп. таблицы. Если клиент подвис, то через час эта запись уже никому не помешает, а ночью :))) чистить вспю таблицу! Не совсем конечно, но ... может будет толчок к новым мыслям :)


Evgen   (2004-01-30 13:11:00) [4]

Да, этот вариант я рассматривал, но предположим, что я выбрал пессимистическую блокировку, клиент просто может повиснуть и у меня навсегда позиции окажутся заблокированы? Именно в этом и суть моего вопроса.
P.S. Оптимистический вариант отпадает, т.к. задача оперативная.


Sergey_Masloff   (2004-01-29 19:51:00) [5]

так как вопрос классический - классический и ответ. Оптимистические и пессимистические блокировки. Оптимистическая ты берешь данные и пытаешься потом сохранить. Если кто-то уже успел их поменять - отлуп. Пессимистическая - только собравшись смотреть блокируешь то что смотришь от изменений.


hirlik   (2004-01-29 19:48:00) [6]

Разберитесь с уровнем изолированности транзакций


Наверх

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