Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/55: Рейтинг темы: голосов - 55, средняя оценка - 4.85
3 / 3 / 0
Регистрация: 11.07.2012
Сообщений: 54

Многопользовательское приложение

23.07.2012, 21:26. Показов 11647. Ответов 26
Метки нет (Все метки)

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

Вопрос следующий: Каким способом организовать работу приложения с базой данных? Суть вопроса состоит в том, как предотвратить одновременные запросы. То есть, 2 пользователя одновременно открывают заявку, редактируют ее и затем решают сохранить изменения. Разумеется сохранены будут те данные, которые записал пользователь, нажавший на кнопку "Сохранить" позже. Мне следует избежать этой проблемы.

Заранее спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.07.2012, 21:26
Ответы с готовыми решениями:

Многопользовательское приложение с бд
бъясните пожалуйста, как что происходит. Создал бд в vs2012. Написал клиентское приложение(пока просто коннектится к базе). Как...

Многопользовательское приложение
Добрый день! Необходимо создать многопользовательское приложение для работы с БД. СУБД будет располагаться на сервере. На рабочих...

Многопользовательское приложение бд
Здравствуйте! Я новичок в c# и столкнулся с таким вопросом: имеется форма авторизации, данные берутся из таблиц. У авторизовавшихся...

26
 Аватар для ksk
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
 Аватар для ksk
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
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
24.07.2012, 00:05
А нельзя просто сделать для каждой заявки bool Flag, если при попытке редактирования flag == true (занято) в доступе на редактировании отказывать иначе выставлять Flag = true и разрешать. Тогда не нужно будет никакого времени на "ожидание", просто происходит запрос - и если не занято, то давать доступ.
0
 Аватар для ksk
624 / 495 / 43
Регистрация: 05.07.2010
Сообщений: 1,589
24.07.2012, 06:44
Конечно нельзя.
Потому что есть время между запросом состояния флага и его установкой в течении которого другой клиент может прочитать состояние флага.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
24.07.2012, 08:16
ksk, А вот на запрос флага как раз можно ввести задержку, которая будет несравнимо меньше, чем в первом случае
0
3 / 3 / 0
Регистрация: 11.07.2012
Сообщений: 54
24.07.2012, 08:24  [ТС]
Psilon , не я думаю все же способ ksk - лучше. Потому как в эту, дополнительную, таблицу, можно добавить скажем поле-ссылку на пользователя который заблокировал запись. Это может пригодится, одним словом это более гибкий подход хотя и более геморный
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
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
25 / 25 / 5
Регистрация: 21.10.2009
Сообщений: 95
Записей в блоге: 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
 Аватар для ksk
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
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
25.07.2012, 11:44
я бы рекомендовал обратить внимание на то, как реализуется обеспечение целостности данных в автоматически генерируемых запросах в VS.
0
47 / 47 / 7
Регистрация: 09.06.2012
Сообщений: 148
25.07.2012, 13:10
nio, а как там реализовано? можно ссылочку?
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
25.07.2012, 13:19
Цитата Сообщение от Besnywka Посмотреть сообщение
можно ссылочку?
это прям в студии смотреть нужно (возможно на msdn где-нить сказано)
Цитата Сообщение от Besnywka Посмотреть сообщение
а как там реализовано?
к примеру запрос на таблицу со столбцами id(ключ), Name, Value выглядит так
SQL
1
UPDATE MyTable SET Name="новое_значение", [VALUE]=новое_значение WHERE id = ключевое_значение (либо старое_значение) AND Name="старое_значение" AND [VALUE]=старое_значение
Таким образом, если один пользователь изменит данные, то другой уже не сможет этого сделать пока не получит обновленную версию значений.
0
47 / 47 / 7
Регистрация: 09.06.2012
Сообщений: 148
25.07.2012, 13:39
nio, (уж не знаю оффтоп это или еще нет) а что в этом запросе на апдейт такого примечательного? Каким образом он влияет на доступность записи для других пользователей? Разве не сама СУБД ставит блокировку на запись, которая в данный момент изменяется?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.07.2012, 13:39
Помогаю со студенческими работами здесь

Многопользовательское приложение, работающее с одной БД
Добрый день. Имеется microsoft visual c# 2010 и sql server 2008 express. Задача состоит в написании приложения которое будет...

Многопользовательское приложение и работа с локальными БД
Пишу многопользовательское приложение типа записной книжки, представляющую собой базу контактов и информацию по ним (имя, фамилия, телефон...

Многопользовательское приложение для работы с БД SQL Server
Собственно проблема в том, что мне нужно 3 вида пользователя: Админ, Редактор БД, Пользователь. При входе в программу пользователь...

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

Многопользовательское приложение
Доброго времени суток. Требуется создать приложение на Delphi 7 с использованием базы данных Interbase 6.5. Приложение будет установлено на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru