|
3 / 3 / 0
Регистрация: 11.07.2012
Сообщений: 54
|
|
Многопользовательское приложение23.07.2012, 21:26. Показов 11647. Ответов 26
Метки нет (Все метки)
Привет товарищи программисты! Есть вопрос касательно проектирования приложения WinForms. Планирую создать приложение, многопользовательское приложение, что-то на подобии журнала заявок. Заявка может создаваться, вешаться на конкретных людей, редактироваться, менять свое состояние и т.п.
Вопрос следующий: Каким способом организовать работу приложения с базой данных? Суть вопроса состоит в том, как предотвратить одновременные запросы. То есть, 2 пользователя одновременно открывают заявку, редактируют ее и затем решают сохранить изменения. Разумеется сохранены будут те данные, которые записал пользователь, нажавший на кнопку "Сохранить" позже. Мне следует избежать этой проблемы. Заранее спасибо!
0
|
|
| 23.07.2012, 21:26 | |
|
Ответы с готовыми решениями:
26
Многопользовательское приложение с бд Многопользовательское приложение Многопользовательское приложение бд |
|
624 / 495 / 43
Регистрация: 05.07.2010
Сообщений: 1,589
|
|
| 23.07.2012, 21:53 | |
|
Я бы завёл таблицу блокировок, в которой периодически обновлял бы (из формы редактора бланка) метку времени в записи, содержащей ID редактируемой сущности. И не давал бы другому возможность редактирвания, пока разница во времени от метки времени до текущего времени не превысит период обновления плюс небольшой запас. После выхода из редактора удалял бы из таблицы блокировок блокировочную запись, касающуюся редактирования этого бланка, а так же все другие записи с просроченными метками времени (которые могли возникнуть при выключении питания), чтоб там мусор не копился.
Есть и другие способы, чем-то менее сложные, чем-то менее гибкие, но я их не пользую.
1
|
|
|
3 / 3 / 0
Регистрация: 11.07.2012
Сообщений: 54
|
|
| 23.07.2012, 21:57 [ТС] | |
|
Принимается! А, автоматических средств в MSSQL или Net. стало быть нет?
0
|
|
|
624 / 495 / 43
Регистрация: 05.07.2010
Сообщений: 1,589
|
|
| 23.07.2012, 22:18 | |
|
в ADO.Net есть обёртка, которая перед сериализацией сравнивает исходное состояние с актуальным, и если не совпадает - отказывается сабмитить (есть такая книжка - ADO.NET). Эту технологию я и обозвал менее сложной и менее гибкой.
А в MSSQL этого нет - это задача клиента а не СУБД. Как СУБД она даёт полную свободу творчества для самостоятельной реализации данного функционала напримет тем саособом, который я описал.
1
|
|
|
3 / 3 / 0
Регистрация: 11.07.2012
Сообщений: 54
|
|
| 23.07.2012, 23:04 [ТС] | |
|
ksk, понял. Спасибо!
0
|
|
|
Master of Orion
|
|
| 24.07.2012, 00:05 | |
|
А нельзя просто сделать для каждой заявки bool Flag, если при попытке редактирования flag == true (занято) в доступе на редактировании отказывать иначе выставлять Flag = true и разрешать. Тогда не нужно будет никакого времени на "ожидание", просто происходит запрос - и если не занято, то давать доступ.
0
|
|
|
624 / 495 / 43
Регистрация: 05.07.2010
Сообщений: 1,589
|
|
| 24.07.2012, 06:44 | |
|
Конечно нельзя.
Потому что есть время между запросом состояния флага и его установкой в течении которого другой клиент может прочитать состояние флага.
0
|
|
|
3 / 3 / 0
Регистрация: 11.07.2012
Сообщений: 54
|
|
| 24.07.2012, 08:24 [ТС] | |
|
Psilon , не я думаю все же способ ksk - лучше. Потому как в эту, дополнительную, таблицу, можно добавить скажем поле-ссылку на пользователя который заблокировал запись. Это может пригодится, одним словом это более гибкий подход хотя и более геморный
0
|
|
|
Master of Orion
|
|
| 24.07.2012, 08:25 | |
|
Kilimangaro, поле-ссылка - тот же флаг, только более продвинутый (то есть как функция удаления, может иметь тип void, а более продвинутый вариант имеет тип bool, показывая, что удаление получилось или нет).
0
|
|
|
3 / 3 / 0
Регистрация: 11.07.2012
Сообщений: 54
|
|
| 24.07.2012, 08:34 [ТС] | |
|
Psilon , есть подозрения что мы говорим о разном. Я говорю об отдельной таблице, где фиксируются заблокированные записи и эта таблица уже будет иметь дополнительное поле-ссылку на пользователя, который в данный момент редактирует запись.
А ты вроде бы говорил, о том, что бы прямо в таблице заявок добавить поле, типа bool которое будет проверкой на занятость. Но это не так гибко. Например, если просто выводить, что запись занята и не может быть редактирована, рано или поздно пользователи захотят, что бы выводилось еще кем она занята (имя пользователя). Если скажем одновременно работает 10-15 пользователей, то кричать на весь офис, кто в какой записи сидит не удобно. Опять таки, любое приложение может быть расширено, таким образом будут в дальнейшем редактироваться не только заявки, а еще и какие либо новые данные. В этом случае, в эту таблицу тоже необходимо добавлять новые поля-флаги на блокировку.
1
|
|
| 24.07.2012, 11:08 | |
|
Еще неплохой вариант - в качестве флага занятости в строке таблицы заявок использовать ID пользователя. Чтобы два пользователя не забрали себе одну и ту же заявку (не открыли ее), можно использовать update с хинтом rowlock where айди_заявки = 'требуемый_айди' AND (признак_блокировки = '' OR признак_блокировки = 'айди_текущего_пользователя') и смотреть, что он возвратит. По хорошему, если он сможет проапдейтить строку заявки, то вернет единичку (количество обработанных строк). Если же кто-то уже записал туда свой айди (или пишет сейчас, это должно отработать благодаря rowlock), то апдейт вернет ноль и мы сообщаем пользователю, что заявка уже кем-то открыта.
Этот же подход можно реализовать и с отдельной таблицей блокировок
2
|
|
|
3 / 3 / 0
Регистрация: 11.07.2012
Сообщений: 54
|
|
| 24.07.2012, 11:24 [ТС] | |
|
IgorTsapko, имеет смысл взять на вооружение. Потому, как я изначально и хотел получить сведения об этих хитах. Благодаря твоему посту, задал пару грамотных запросов в поисковике и уже читаю информацию. Если хиты себя оправдают то возможно усовершенствую логику блокировки с их помощью
0
|
|
|
146 / 143 / 32
Регистрация: 21.01.2012
Сообщений: 545
|
|
| 24.07.2012, 12:39 | |
|
Я несколько далек от ADO, но недавно делал что-то подобное. Проблему одновременного доступа решал путем разделения вводимых данных и хранилища. то есть пользователь редактирует строку и результаты его деятельности добавляются в очередь обработки. А потом уже обработчик из этой очереди каждую правку добавляет в таблицу.
0
|
|
|
624 / 495 / 43
Регистрация: 05.07.2010
Сообщений: 1,589
|
|
| 24.07.2012, 21:57 | |
|
Поле - ID пользователя в таблице блокировок - это правильный подход.
Можно юзеру2 показать, что в данный момент заявку редактирует юзер1. Знаю одну бухгалтерскую программу, которая именно именем пользователя блокирует. Только там у них не БД, а текстовый файл.
0
|
|
|
47 / 47 / 7
Регистрация: 09.06.2012
Сообщений: 148
|
|
| 25.07.2012, 11:28 | |
|
а почему никто не вспоминает о таком неотъемлемом средстве любой СУБД, как транзакция?
1
|
|
|
47 / 47 / 7
Регистрация: 09.06.2012
Сообщений: 148
|
|
| 25.07.2012, 13:10 | |
|
nio, а как там реализовано? можно ссылочку?
0
|
|
|
|
||||||||
| 25.07.2012, 13:19 | ||||||||
0
|
||||||||
|
47 / 47 / 7
Регистрация: 09.06.2012
Сообщений: 148
|
|
| 25.07.2012, 13:39 | |
|
nio, (уж не знаю оффтоп это или еще нет) а что в этом запросе на апдейт такого примечательного? Каким образом он влияет на доступность записи для других пользователей? Разве не сама СУБД ставит блокировку на запись, которая в данный момент изменяется?
0
|
|
| 25.07.2012, 13:39 | |
|
Помогаю со студенческими работами здесь
20
Многопользовательское приложение, работающее с одной БД Многопользовательское приложение и работа с локальными БД Многопользовательское приложение для работы с БД SQL Server Скомпилировать приложение так, чтобы другое приложение было у него в ресурсах Многопользовательское приложение Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
|
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма).
На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам
Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|