Транзакции в приложении

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
Lars
Сообщения: 86
Зарегистрирован: 21 дек 2005, 16:34

Транзакции в приложении

Сообщение Lars » 15 май 2006, 05:55

Приложение - работа кассы в обслуживании клиентов.

Есть блюда, которые покупают, в табличке поле CntDish, кторое указывает сколько купили.

Весь день у юзера висит окошко с перечнем блюд, он выбирает блюдо, устанавливает кол-во и нажимает печать чека. Печатает, запрос обнуляет CntDish и так со след. клиентом.

Вопросы.
1. Как лучше оформить работу транзакций, если бухгалтер на др. ПК меняет цену блюда и т.п.
2. Отключение клиента происходит, если окно выбора висит, а действия не выполняелись около часа-полтора?
3. Схема обнуления смущает?

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 15 май 2006, 08:24

Вообще-то интерфейс приложения никак с транзакциями не связан...
Транзакции должны быть как можно более короткими. Т.е. с базой надо работать в стиле "запустил транзакцию-выполнил запросы-закоммитил транзакцию".
По пункту 2: отключения клиента самопроизвольно вообще не происходят.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 15 май 2006, 09:07

2. Отключение клиента происходит, если окно выбора висит, а действия не выполняелись около часа-полтора?
нефиг висеть столько.
www.ibase.ru/devinfo/keepalive.htm

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 15 май 2006, 09:12

1. Обыкновенно с транзакциями, как в букваре написано... То что постоянно висит у оператора перед глазами запускаешь в рид онли рид_коммитит транзакции. При переоткрытии запроса он увидит автоматом все что закоммичено на других клиентах. Рефрешь можно приурочить к пробитию чека, положить пимпочку "Обновить", обновлять по таймеру или эвентами, тут уж на месте сориентируешься.

2. Зачем клиента отключать?

3. Нипониль...

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 15 май 2006, 09:16

kdv писал(а):
2. Отключение клиента происходит, если окно выбора висит, а действия не выполняелись около часа-полтора?
нефиг висеть столько.
www.ibase.ru/devinfo/keepalive.htm
Ну и пусть себе висит, если на нем только рид онли транзакция активна вред от него минимальный.
А пишущую транзакцию стартовать когда оператор уже сформировал весь обед/ужин/завтрак и жмакнул пимпочку "Пробить чек", вот тут стартуем пишую транзакцию пишем все скопом и коммитим ее.

Lars
Сообщения: 86
Зарегистрирован: 21 дек 2005, 16:34

Сообщение Lars » 16 май 2006, 11:27

Ivan_Pisarevsky писал(а):1. Обыкновенно с транзакциями, как в букваре написано... То что постоянно висит у оператора перед глазами запускаешь в рид онли рид_коммитит транзакции. При переоткрытии запроса он увидит автоматом все что закоммичено на других клиентах. Рефрешь можно приурочить к пробитию чека, положить пимпочку "Обновить", обновлять по таймеру или эвентами, тут уж на месте сориентируешься.

2. Зачем клиента отключать?

3. Нипониль...
Выставляем количество купленных блюд, потом обнуляем поле, после печати чека.
UPDATE DISH_SELECT SET CNT_DISH =0 WHERE CNT_DISH<>0;

Меня напрягает этот момент, т.е. юзер каждый раз, когда выделяет блюдо для покупки с кол-вом обновляет таблицу!

Потом запрос проверяет блюда с CNT_DISH > 0 и их печатет с суммами. Вот так.

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 16 май 2006, 11:45

>Меня напрягает этот момент, т.е. юзер каждый раз, когда выделяет блюдо для покупки с кол-вом обновляет таблицу!

-Доктор, когда я делаю ТАК, мне больно...
-А Вы ТАК не делайте!

Ну так не делай так, считай в обычный стринггрид данные и закрой транзакцию, потом юзер проставил колоночку цифирей и жмакнул "пробить чек", проходишься по стринггриду формируешь пишущий запрос, стартуешь транзакцию, исполняешь запрос, коммит. далее все сначала.
Как один из вариантов решения. :)

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 16 май 2006, 12:35

в таких случаях вместо стринггрида используют TClientDataSet.

Lars
Сообщения: 86
Зарегистрирован: 21 дек 2005, 16:34

Сообщение Lars » 16 май 2006, 16:38

kdv писал(а):
2. Отключение клиента происходит, если окно выбора висит, а действия не выполняелись около часа-полтора?
нефиг висеть столько.
www.ibase.ru/devinfo/keepalive.htm
А что предложите делать, если они работают с 8, а в 9-30 только клиенты приходят?! А послеобеденное время?!

Если окно висит, заставка там, или еще что - около часа, может ли закрыться коннект?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 16 май 2006, 17:25

вопросы странные. коннект клиента к БД - это сокет. В виндах есть настройки, которые определяют время жизни неактивного сокета. Если время истекает, ВИНДЫ принудительно закрывают сокет.

Соответственно, решение этой проблемы, если это для тебя проблема, целиком и полностью в твоих руках. Или ты конфигурируешь keepalive, как в статье. Или ты анализируешь неактивность пользователя и через некоторые интервалы "дергаешь" сервер пустопорожним запросом (пусть даже нечто вроде isc_database_info).
Или, после неактивности пользователя корректно закрываешь коннект, с сообщением пользователю, что его время безделья истекло.
Или ....

Я бы вообще - отслеживал время неактивности пользователя, и писал это в лог, или сообщал на сервер. А потом бы или штраф за безделье, или поувольнять часть, или ... :)

Lars
Сообщения: 86
Зарегистрирован: 21 дек 2005, 16:34

Сообщение Lars » 16 май 2006, 18:59

kdv писал(а):вопросы странные. коннект клиента к БД - это сокет. В виндах есть настройки, которые определяют время жизни неактивного сокета. Если время истекает, ВИНДЫ принудительно закрывают сокет.

Соответственно, решение этой проблемы, если это для тебя проблема, целиком и полностью в твоих руках. Или ты конфигурируешь keepalive, как в статье. Или ты анализируешь неактивность пользователя и через некоторые интервалы "дергаешь" сервер пустопорожним запросом (пусть даже нечто вроде isc_database_info).
Или, после неактивности пользователя корректно закрываешь коннект, с сообщением пользователю, что его время безделья истекло.
Или ....

Я бы вообще - отслеживал время неактивности пользователя, и писал это в лог, или сообщал на сервер. А потом бы или штраф за безделье, или поувольнять часть, или ... :)
Я тоже за решение проблем на управленческом уровне :)
Ответы ясны и думаю, что тема исчерпана.

Ответить