|
Схема построения приложения
|
|||
---|---|---|---|
#18+
Мне интересно как вы стоите свои приложения для многопользовательской работы. Мой метод следующий. Есть файловая база данных DBC, в приложении пользователь вызывает форму, данные из таблиц селектом перекочевывают в курсор. Дальше пользователь работает с курсором. Если он сделал какие либо изменения или добавил новую запись, то нажимается кнопка SAVE и данные сохраняются в таблице с помощью (SQL INSERT, UPDATE, DELETE). Вопрос, на сколько такая система жизнеспособна и не упустил ли я что-либо в блокировках? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2008, 20:34 |
|
Схема построения приложения
|
|||
---|---|---|---|
#18+
Два пользователя одновременно запросили и получили данные. Закачали в локальные курсоры. Каждый внес какие-то свои изменения. Теперь оба они по очереди нажимают кнопку "Сохранить". Что имеет в базе данных? Очевидно, данные того пользователя, который нажал кнопку "Сохранить" последним. Т.е. первый пользователь потерял свои изменения без каких-либо "извинений" и "предупреждений" со стороны приложения. Вас такая стратегия работы устравивает? Если "Да", то Ваша система вполне жизнеспособна. Стратегия работы в сетевом режиме зависит от постановки задачи и личных предпочтений программиста. Существуют две принципиальные стратегии: пессимистическая и оптимистическая. Каждая имеет достоинства и недостатки. Пессимистическая. Как только пользователь предпринимает попытку что-то изменить в исходных данных эти данные блокируются. И другой пользователь уже в принципе не может ничего изменить в тех же данных, пока первый пользователь не закончит редактирование и не снимет блокировку. Достоинства - в принципе невозможны конфликты совместного доступа. Та ситуация, которая описана в самом начале темы. Недостатки - пользователь начал редактировать данные, но тут отвлекся, а потом ушел "на обед". А все остальные пользователи ждут, когда же он вернется. Оптмистическая. Пользователи работают с копией данных и ничего не знают о том, как работают другие пользователи до того момента, как нажимают кнопку "Сохранить". Именно в этот момент происходит блокировка данных, но на очень короткий промежуток времени. Только для того, чтобы сбросить накопившиеся изменения. Достоинства - нет периода "ожидания". Никто никого не ждет. Создается иллюзия, что пользователь работает один с приложением. Недостатки - конфликты совместного доступа. Та ситуация, которая была описана в самом начале. Изменения одного пользователя могут затереть изменения другого. Еще раз повторю, какую стратегию выбрать, зависит от конкретной задачи и личных предпочтений программиста. Хочу только еще заметить, что то, что Вы делаете - это "закат солнца вручную". В том смысле, что в FoxPro существуют инструменты, которые делают все тоже самое, но автоматически. Во-первых - это собственно режим буферизации. Можно наложить прямо на исходную таблицу. Хотя, как правило, этого не делается. Во-вторых - это объект Local View. Если сделать его обновляемым, то сделанные в нем изменения будут "сбрасываться" в исходные таблицы. В-третьих - это класс CursorAdapter (введен в VFP8). По сути, это расширение возможностей Local View. Больше мест, где есть возможность вмешаться программисту в процесс выборки данных и сброса изменений в исходные таблицы. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2008, 21:32 |
|
Схема построения приложения
|
|||
---|---|---|---|
#18+
Спасибо Владимир за столь обстоятельный ответ. Вы как всегда в ударе. Про "закат солнца вручную" согласен, но мне так больше нравится. Попробую и с CursorAdapter конечно. Для меня важна сама методология, т.е. сформировать ряд правил, чтобы в последствии было легко писать и поддерживать большие приложения. На C++ делаю в принципе тоже самое, т.е. формирую локальный снимок у пользователя со служебными данными, и сбрасываю при сохранении обратно, но только то, что изменили конечно. Про коллизию можно не беспокоиться, пусть пользователи себе изменяют данные ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2008, 22:22 |
|
Схема построения приложения
|
|||
---|---|---|---|
#18+
В некоторых приложениях (FPW2.6) я использовал изложенную стратегию. Чтобы не возникала указанная выше коллизия я блокировал редактируемую запись командой LOCK. При попытке открыть ее другой пользователь получал сообщение о том, что запись редактируется, кнопка Save cоответственно делалась недоступной. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2008, 11:38 |
|
Схема построения приложения
|
|||
---|---|---|---|
#18+
Dag вы сказали в прошлом. А как дела обстоят сейчас? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2008, 11:42 |
|
Схема построения приложения
|
|||
---|---|---|---|
#18+
Если честно-то, схема получилась достаточно удачной и этот допотопный метод вполне работает и под VFP6, VFP9. Так что я даже не удосужился изучить буферизацию, Local View и прочие навороты, реализующие подобный функционал. Ибо для моих скромных целей нужды в этом просто не возникало. Но т-с-с! Гуру засмеют. Если Вы беретесь создавать код для подобных целей и не обременены поддержкой решений созданных во "времена покорения Крыма", то советую обратить внимание на CursorAdapter. Интересная штучка-мне кажется, что при необходимости позволит перенести данные из табличек dbf на SQL-сервер, без особых переделок в программе, ориентированной на работу с данными, представляемыми посредством курсорадаптеров. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2008, 13:05 |
|
Схема построения приложения
|
|||
---|---|---|---|
#18+
Пессиместические блокировки - это очень плохо. Например: Есть список лицевых счетов. Куча операторов, которые могут редактировать данную информацию. В то же время есть необходимость менять что-то "чёхом" (т.е. "пакетное" обновление информации - по данным из управляющих компаний и проч.) Соответственно при попытки накатить такие обновления имеем кучу предупреждений, о том, что запись в данный момент занята. А это не есть хорошо. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2008, 13:08 |
|
Схема построения приложения
|
|||
---|---|---|---|
#18+
авториз табличек dbf на SQL-сервер, без особых переделок в программе курсорадаптер для родных таблиц и ODBC и принцип работы с ними отличаются в некоторых местах, поэтому без особых не получится но, конечно навыки работы с КАДами оч.пригодятся и сэкономят время и силы при переходе на работу с SQL сервером ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2008, 14:15 |
|
Схема построения приложения
|
|||
---|---|---|---|
#18+
Можно и обработчик сделать обновлений, спрашивать у юзверя, типа данные были изменены другим пользователем, менять или пропустить и пр. Я на основе стандартного класса написал обработчик, кой чего переделал. Так что так же работаю, через курсор скидываю в буфферизированную таблицу и потом проверку делаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2008, 17:07 |
|
Схема построения приложения
|
|||
---|---|---|---|
#18+
Интересующийся_ Если он сделал какие либо изменения или добавил новую запись, то нажимается кнопка SAVE и данные сохраняются в таблице с помощью (SQL INSERT, UPDATE, DELETE). Вопрос, на сколько такая система жизнеспособна и не упустил ли я что-либо в блокировках? Вполне жизнеспособна, только надо добвавить ещё выполнение модификации данных в транзакции. Но лучше всё таки для сброса изменений в таблички использовать буфферизацию, один из плюсов - значительно легче будет написать обработчик ошибок, ведь 90% уже написано FoxTeam. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2008, 09:37 |
|
|
start [/forum/topic.php?fid=41&fpage=148&tid=1587311]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
28ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
98ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 178ms |
0 / 0 |