Многопользовательское приложение... - как лучше?

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

Модератор: kdv

Ответить
VaXoID
Сообщения: 10
Зарегистрирован: 20 мар 2006, 21:00

Многопользовательское приложение... - как лучше?

Сообщение VaXoID » 20 мар 2006, 21:13

Вопрос от новичка, немного запутался при обзоре литературы.
Ситуация такая, скажем есть список сотрудников(ФИО). И эту таблицу редактируют несколько человек. Использую СУБД IB через FIB.
Нужно чтоб у всех пользователей регулярно обновлялся этот список, к примеру после коммита в максимально короткий срок у других уже появилась новая информация. Если нет таого события, то можно и по таймеру проверять.
Вот тут и вопрос, что лучше использовать, Query, и регулярно выполнять Select? Или настроить все через DataSet и DBGrid??
Попытался настроить последнее, но как обновить запрос Select.
Еще беда, если я вношу данные, то нужно завершить транзакцию, и тогда соответственно закрывается DataSet, т.е. я у пустого грида...

Расскажите плиз, что к чему и что не так... :roll:

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Re: Многопользовательское приложение... - как лучше?

Сообщение Merlin » 20 мар 2006, 21:24

VaXoID писал(а): Нужно чтоб у всех пользователей регулярно обновлялся этот список, к примеру после коммита в максимально короткий срок у других уже появилась новая информация.
Не нужно. Поверь.
VaXoID писал(а): Еще беда, если я вношу данные, то нужно завершить транзакцию, и тогда соответственно закрывается DataSet, т.е. я у пустого грида...
Либо используешь не тот FIB, либо тот, но не так.

VaXoID
Сообщения: 10
Зарегистрирован: 20 мар 2006, 21:00

Сообщение VaXoID » 21 мар 2006, 06:17

Использую FIB 6.25, Компоненты - DataBase + Transaction + DataSet + DataSource + DBGrid.
У DataSet в SelectSQL прописан "Select * траляля", делаю

Код: Выделить всё

pFIBDataSet1.Active:=True;
Как я понимаю открывается новая транзакция....
Видимо проблема в том что я использую тот же компонент транзакции (Insert через Query) и DataSet все захламывает после коммита.

Даже если ненадо обновлять данные максимально быстро, думаю что это действительно так, но хотябы раз в 30 минут это потребуется - как это сделать?

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

Сообщение Dimitry Sibiryakov » 21 мар 2006, 08:00

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

SAMZ
Сообщения: 128
Зарегистрирован: 21 мар 2005, 08:17

Re: Многопользовательское приложение... - как лучше?

Сообщение SAMZ » 21 мар 2006, 08:10

VaXoID писал(а):Вопрос от новичка, немного запутался при обзоре литературы.
Еще беда, если я вношу данные, то нужно завершить транзакцию, и тогда соответственно закрывается DataSet, т.е. я у пустого грида...

Расскажите плиз, что к чему и что не так... :roll:
Скорее всего ты при работе с DataSet используешь одну транзакции для чтения и записи. После редактирования и постирования ты жестко завершаешь транзакцию и в полном соответствии с правилами набор данных закрывается.
Если все это так, то
1. Научись работать с наборами в контексте двух транзакйий
2. При грамотном использовании транзакцийй (при корректном, соответстующем бизнес логике твоей задачи, выборе параметров транзакций) никаких переоткрываний наборов через 30 мин не потребуется.
3. Почитай Мир Интербэйс, там обо всем этом распрекрасно написано.
4. Будешь читать и пробовать отнесись с некоторой долей настороженности к возможности мягкого завершения транзакций

VaXoID
Сообщения: 10
Зарегистрирован: 20 мар 2006, 21:00

Re: Многопользовательское приложение... - как лучше?

Сообщение VaXoID » 21 мар 2006, 09:44

SAMZ писал(а):4. Будешь читать и пробовать отнесись с некоторой долей настороженности к возможности мягкого завершения транзакций
Видимо там есть подводный камень?
Ну а различия между "мягким" и "жестким" завершением, видимо придется еще изучить :(

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

Сообщение kdv » 21 мар 2006, 09:45

Как я понимаю открывается новая транзакция....
а ты их сам стартуй.
www.ibase.ru/devinfo/ibx.htm

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 21 мар 2006, 13:17

У меня есть 10 мин на философию. Слушай суды. Что есть набор, показываемый пользователю в гриде? Всего лишь навигационный интерфейс для принятия решения по выбору одной из записей набора для редактирования. Наплевать, что с момента открытия набора её кто-то уже 10 раз изменил. Просто перед началом редактирования именно эту запись следует отрефрешить. Не весь набор, а эту. FIBPlus, в отличие от IBX, позволяет использовать для чтения набора одну транзакцию, а модификаций записи - другую. Как - ищи сам, я с ним не работаю, у меня свой IBX, модифицированный в этом отношении сходным образом, даже малость поглыбже - я могу любому ...SQL TIBDataSet в любой момент назначить любую транзакцию. Я перед редактировнаием вешаю RefreshSQL и ModifySQL на одну транзакцию и перед Post возвращаю RefreshSQL на транзакцию SelectSQL. Если изменения инкрементные, то для этой транзакции выбирают уровень изоляции read_commited, если нужно гарантировать невозможность затирания одних изменений другими - concurrency. То есть, редактирование включает в себя первым шагом получение атуального вида новой записи. И если решение о редактировании было ошибочным из-за устаревания информации в основном наборе, пользователь просто отменяет его. Если набор достаточно интенсивно изменяется несколькими пользователями и SelectSQL не слишком тяжёлый, я переоткрываю его с восстановлением позиционирования после каждого редактирования, чтоб не морочить людям голову и уменьшить количество холостых попыток. Нет - рефрешу только текущую запись и оставляю решение о переоткрытии основного набора на усмотрение пользователя. Использвание евентов как сигнализаторов, мол изменения есть, хочешь - перечитай, занят делом или пофиг - тебе жить - в принципе хороший тон, но до последнего времени было сопряжено с некоторым гемором. Использование их для принудительного рефреша выборок - издевательство над сервером, сеткой и пользователем, у которого в самый неподходящий момент прыгает экран и цифирьки мельтешат в глазах. Малость подробнее техника работы в многопользовательской среде показана здесь: http://www.ibase.ru/devinfo/pslock.htm . Только умоляю, не бросайся блокировать всё подряд, не порть мне карму. Почитай внимательно, когда это действительно нужно.

Zhur
Сообщения: 125
Зарегистрирован: 01 мар 2006, 18:17

Re: Многопользовательское приложение... - как лучше?

Сообщение Zhur » 22 мар 2006, 11:20

SAMZ писал(а):1. Научись работать с наборами в контексте двух транзакйий
Ничего, что я влезу?
Днло в том, что я как раз этому и учуся.
Недопетрю одну вещь: в IBQuery, IBDataSet имеется свойство Transaction, а в UpdateSQL - нету. Как тогда указать апдейту, в какой транзакции он долже работать?

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

Сообщение kdv » 22 мар 2006, 13:04


Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 22 мар 2006, 13:28

kdv писал(а):www.ibase.ru/devinfo/ibx.htm !!!
Уже напоминает старый анек, про любовника, неловко спрятавшегося под кроватью, так что видно было задницу. На вопрос - что это - муж получил ответ - да так, тазик лежит. Ну, муж тресь по нему ногой - этот из под кровати - Бум! Опять тресь! - Бум! Тресь! - Да Бум же, #% твою мать!!! :-D

Zhur
Сообщения: 125
Зарегистрирован: 01 мар 2006, 18:17

Сообщение Zhur » 22 мар 2006, 13:40

Merlin писал(а):
kdv писал(а):www.ibase.ru/devinfo/ibx.htm !!!
Уважаемый Дмитрий: Я ознакомиллся с данной статьей... Цитирую:
"Эта проблема решается, причем один из способов описан выше - это вынос запросов insert/update/delete в отдельные компоненты IBSQL/IBQuery. Второй способ - использование IBQuery + специальная модификация IBUpdateSQL, которая может быть "прицеплена" к другой транзакции, нежели IBQuery (В FIBPlus компонент pFIBDataSet по умолчанию имеет 2 свойства для подключения читающей и пишущей транзакции). Таким образом, получается, что мы можем выполнять чтение (IBQuery) в одной транзакции, а модификацию (IBUpdateSQL) - в другой. И эту другую, пишущую транзакцию, можно сделать максимально короткой - в самом простом случае в ней будет выполняться всего один оператор."
Там еще и рисунок прилагается...
А вот как указать в UpdateSQL к какой транзакции она должна выполняться - не понял.
Не обессудьте, ежели я, по Вашему мнению, так глуп.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 22 мар 2006, 13:46

Уважаемый Василий! Ни Дмитрий, ни я, ни кто другой, не возьмётся по инету судить, глуп ты или нет. Но вот то, что прочитать даденные ссылки до конца тебе влом - это адназначна. Ну, раскрывай рот, подношу ложечку из той самой статьи:
IBUpdateSQLW

В поставке такого компонента нет. Зато он есть здесь. Он предназначен для выполнения операторов Select/refresh и insert/update/delete в разных транзакциях. Зачем это нужно, см. дальше информацию по транзакциям в приложении.
Слово "здесь" там синенькое. Это значить, что в него можно тыкнуть мышком.

Zhur
Сообщения: 125
Зарегистрирован: 01 мар 2006, 18:17

Сообщение Zhur » 22 мар 2006, 13:56

Спасибо за ложечку... я все понял.... ужо кушаю.
А если серьезно, то и вправду спасибо. И передайте Дмитрию, что руку над этим форумом заносить - грех.

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

Сообщение kdv » 22 мар 2006, 14:12

И передайте Дмитрию, что руку над этим форумом заносить - грех.
да я так, в шутку. раз создал - пусть живет.

Zhur
Сообщения: 125
Зарегистрирован: 01 мар 2006, 18:17

Сообщение Zhur » 22 мар 2006, 15:11

kdv писал(а):
И передайте Дмитрию, что руку над этим форумом заносить - грех.
да я так, в шутку. раз создал - пусть живет.
Это радует

VaXoID
Сообщения: 10
Зарегистрирован: 20 мар 2006, 21:00

Сообщение VaXoID » 24 мар 2006, 20:47

Еще вопросик...
Тригеры в Master-Detail таблице вообще никак нильзя использовать? Даже те которые создаються Before_insert???
Я так понимаю в FIB реализован автогенерирования ключа....но что надежней / удобней?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 24 мар 2006, 21:14

VaXoID писал(а):Еще вопросик...
Тригеры в Master-Detail таблице вообще никак нильзя использовать?
Ёпть... Аж огурцом подавилсо... Пришлось сразу вторым стаканом запить... Каккая-такая Мастер-Деталь таблицА? С FK на саму себя что ли?
VaXoID писал(а): Даже те которые создаються Before_insert???
Даже если Defore каждый Insert создавать по триггнеру, то использовать триггера всё равно можно. Но так чтоб точноо знать в каком порядке срабатыывают, только 256 раз инсёртить полчится.
VaXoID писал(а): Я так понимаю в FIB реализован автогенерирования ключа....но что надежней?
Ааа, вот ты об чём. Страховой полис надёжнее всего. В приложении значение генератора получают с сервера для того чтобы тут же использовать. Не только дял вставке в деталь, для позиуционирования и рефреша тоже нужен. А в Before Insert триггере пришут if (New.Id Is Null) then New.ID=Gen_ID(This_Generator, 1); на случай вставки через IBExpert например или ещё какого нетипичного. Для страховки так сказать. А если тебе нужно наоборот, отсечь случайную вставку помимо приложения, то не пишут. А ненадёжность... Ну какая такая ненадёжность? Получил на клиенте новое значение генератора и клиент упал не успев вставить? И что будет? Ну пропадёт из последовательнсти одно значение, да и чёрт с ним, их там на 300 лет непрерывных инсёротв хватит.

VaXoID
Сообщения: 10
Зарегистрирован: 20 мар 2006, 21:00

Сообщение VaXoID » 26 мар 2006, 10:05

Я просто не так выразился, думал меня поймут... Естесственно это 2 таблицы...
Просто в статье www.ibase.ru/devinfo/ibx.htm автор не рекомендует пользоваться тригерами. Мне непонятно почему!

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

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

автор не рекомендует пользоваться тригерами.
это где я там не рекомендую пользоваться триггерами? Для генераторов? Так там же ссылка на статью про генераторы есть, где все разжевано.

Ответить