3 / 3 / 0
Регистрация: 11.07.2012
Сообщений: 54

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

23.07.2012, 21:26. Показов 11810. Ответов 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
25.07.2012, 14:04
Студворк — интернет-сервис помощи студентам
Если транзакционность, или блокировка записи поможет другому (кроме заблокироваашего) приложению понять, что конкретная запись взята редактирование от имени такого-то юзера, это было бы удобным решением. Но я такого способа применения транзакций и блокировок не знаю пока )
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
25.07.2012, 14:05
Цитата Сообщение от Besnywka Посмотреть сообщение
а что в этом запросе на апдейт такого примечательного?
примечательность в том, что если несколько пользователей прочли данные из БД, поменяли их и через некоторое время пытаются сохранить, то сохранение выполниться только для первого пользователя, попытки остальных пользователей произвести сохранение будут безуспешными.
Цитата Сообщение от Besnywka Посмотреть сообщение
Каким образом он влияет на доступность записи для других пользователей?
Никаким. Более того, данный запрос не требует никаких методов блокировки записей (типа транзакций, дополнительных столбцов с учетом занятости строки и т.п.), что несомненно положительно сказывается на производительности и упрощает код для доступа к данным.

Цитата Сообщение от Besnywka Посмотреть сообщение
Разве не сама СУБД ставит блокировку на запись, которая в данный момент изменяется?
СУБД ставит блокировку на обновление данных в момент выполнения запроса, а не в процессе работы. Как я понял ТС это не устраивает, в данном случае никакие дополнительные блокировки не нужны.
2
47 / 47 / 7
Регистрация: 09.06.2012
Сообщений: 148
25.07.2012, 15:01
в принципе косвенно "отловить" работу чужой транзакции возможно. К примеру поставить для вашей транзакции режим блокировки nowait, тогда sql вернет Вам сообщение с ошибкой о возникшем конфликте с более ранней транзакцией.
0
 Аватар для ksk
624 / 495 / 43
Регистрация: 05.07.2010
Сообщений: 1,589
25.07.2012, 18:32
и держать транзакцию открытой пока первый юзер ненаредактируется?
как-то неудобно. я бы остался с вариантом таблички блокировок. Оно и "второму" пользователю можно будет показать, кто держит запись, чтобы он мог пойти и сказать ему, и это уже юзеролюбиво )

А вот для обработки автоматически поступающих данных предложенный Вами подход вполне даже оправдан, и если источник данных напорется на такую блокировку, то это будет сигналом о несогласованности поступающих данных.

По предложению "первый записал остальным ошибка" - это опять таки не юабилитично - гораздо лучше пользователю в момент открытия бланка редактирования сделать его readonly, и сказать, что такой-то уже редактирует эту запись, чем торжественно обломать пользователя после того, как он, потратив время и силы, заполнит много полей данных и радостно нажмёт кнопку "сохранить". Да и много WHERE предполагает индексы по всем контролируемым полям (тормоза при вставке), либо тормоза при обновлении, что тоже не всегда приемлемо.

Короче, все технологии и подходы хороши, но у каждой есть своя областть оптимальной применимости.
1
47 / 47 / 7
Регистрация: 09.06.2012
Сообщений: 148
25.07.2012, 20:20
ksk, согласна с Вами насчет юзабилити. Но все–таки насчет транзакций хочу добавить, что транзакция будет выполняться единожды при каждом сохраннии данных. При плвторном редактировании производится уже следующая (новая) транзакция, так что из–зяа одного пользователя вся работа не встанет. А транзакцию без ожидания при ее прерывании можно перезапустить. И ообще, насколько я знаю, по умолчанию любая операция с данными рассматртвается СУБД в качестве транзакции с ожиданием
0
3 / 3 / 0
Регистрация: 11.07.2012
Сообщений: 54
25.07.2012, 21:18  [ТС]
ksk, как не крути но самый оптимальный вариант это твой. И прозрачен и универсален и легко расширяем.

Но всем остальным тоже спасибо, есть над чем поразмыслить!
0
 Аватар для ksk
624 / 495 / 43
Регистрация: 05.07.2010
Сообщений: 1,589
25.07.2012, 22:24
Besnywka, всё правильно. Только я не понял, что в Вашем варианте будет делаться между чтением данных и их записью, в то время, пока пользователь будет редактировать данные в окне программы. Что должно в это время защитить другого пользователя от того, чтобы он начал редактировать эту же запись?

Клиент должен держать открытую транзакцию из окна редактирования?
В принципе это должен быть работоспособный вариант (правда, я не пробовал так делать).
И я не знаю, что будет, если в этот момент отключат питание клиенту / порвётся сеть итд.
Сервер просто удалит из transaction_log незакоммиченную транзакцию и разблокирует запись?

Kilimangaro, рад, если оно было полезным. Другие методы тоже существуют, но я сторонник "ручной работы" именно в силу гибкости такого подхода.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.07.2012, 22:24

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Опции темы

Новые блоги и статьи
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru