Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многопользовательский доступ 
:(
    Опции темы
Sherst
Дата 27.7.2006, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 26.10.2005

Репутация: нет
Всего: 2



Привет всем!

Ребят, кто как решал проблему многопользовательского доступа и на какие грабли при этом наступали. Сам думаю использовать запрос select for update.

Т.е. на Java будет выглядеть примерно так:

Код

        pst = Conn.prepareStatement("select * from HolidayGrafic where LoginID=? for update");
        pst.setString(1, hol.getOperator().LoginID);
        rs = pst.executeQuery();


В качестве сервера баз данных использую Oracle. 
PM MAIL   Вверх
powerOn
Дата 27.7.2006, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Не могу понять, в чем проблема-то? 


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Sherst
Дата 27.7.2006, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 26.10.2005

Репутация: нет
Всего: 2



Если 2 человека попытаются одновременно отредактировать одну запись в таблице, то результат будет
плачевным ... 
PM MAIL   Вверх
w1nd
Дата 27.7.2006, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Способы объехать такую несправедливость, как одновременные запросы на update:
  • select for update (только для Oracle);
  • транзакции (отключить autocommit), тогда в БД попадут данные последнего updater'а;
  • работа ВСЕХ клиентов с transaction isolation == serialized
 


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Stampede
Дата 27.7.2006, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 24
Всего: 144



Стоп-стоп-стоп, товарищи. Тут далеко не все так просто.

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

Если выборка и обновление происходят в рамках одной транзакции, то тут все достаточно просто. Можно, как уже упоминалось, воспользоваться конструкцией select for update (хотя это и некошерно в силу непереносимости). Гораздо удобнее ввести внешнюю синхронизацию: через примитивы синхронизации Java или через атрибуты управления транзакциями (если речь идет о компонентной архитектуре). Тут все основывается на предположении, что транзакции короткие и быстрые.

Гораздо хуже, если сценарий предполагает между чтением и записью какие-то действия пользователя. Сложность тут в том, что в этом случае категорически недопустимо вводить какую-бы то ни было блокировку, потому что никто не знает наперед, как долго юзер будет держать форму открытой (например, уйдет на обед). Это то, что я называю фактором "ковыряния в носу" smile

Между тем конфликты - вещь абсолютно реальная.  Расмотрим такую, очень даже возможную, ситуацию:
  • Юзер А открывает форму для редактирования какой-то инфы (например, описание товара). Данные для формы выбираются из базы.
  • Юзер Б открывает форму для этого же товара.
  • Юзер А меняет название, сохраняет форму
  • Юзер Б меняет артикул, сохраняет форму
Что в итоге? Изменения, сделанные юзером А, окажутся безвозвратно потеряны. Что еще хуже, никому и в голову не придет, что произошла накладка, пока кто-нибудь это случайно не обнаружит.

Как с этим бороться? Ну, есть разные способы, но вот легких среди них - увы, нет. Перечислю несколько наиболее распространенных.

Избирательное обновление

Предлагается отлавливать, какие именно поля были изменены, и делать апдейт только этих полей. Как вариант, изменения не отлавливать, а сохранять копию исходной записи и изменения обнаруживать путем сравнения.

Недостаток в том, что вместо одного общего апдейта придется писать команды для обновления каждого поля.

"Версирование" записей

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

Недостаток: усложнение сценариев диалога.

В принципе можно придумать массу и других способов. Кроме того, описанные способы тожу не универсальны и там может быть куча разных нюансов. Что, например, если редактирование в том числе предполагает добавление/удаление записей в связанной таблице? Поэтому все что я хотел - это дать более расширенное описание проблемы и накидать общие пути решения. 

А если хочешь более конкретного совета - выкладывай исходные данные.  

Это сообщение отредактировал(а) Stampede - 27.7.2006, 23:03


--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
Bulat
Дата 28.7.2006, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 4
Всего: 57



А если прибегнуть к некоторым конструкциям хибернэйта  smile 
Опыта не много, но кажется очень хорошо решается подобная проблема, причем использование самого хибернэйта совсем не обязательно  smile  


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
tux
Дата 28.7.2006, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 31
Всего: 132



Цитата(Bulat @  28.7.2006,  18:32 Найти цитируемый пост)
А если прибегнуть к некоторым конструкциям хибернэйта  smile 
Опыта не много, но кажется очень хорошо решается подобная проблема, причем использование самого хибернэйта совсем не обязательно  smile   

Это как это? Использовать конструкции Hibernate не используя сам Hibernate? Объясни.

"Версирование" записей в Hibernate реализовано. Если проект позволяет, можно использовать. Сделать оптимально избирательное обновление мне кажется уж слишком сложно. 
PM MAIL Skype GTalk Jabber YIM   Вверх
Bulat
Дата 28.7.2006, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 4
Всего: 57



создавать, контейнеры-классы, списки, и работать не напрямую с БД, а с данными в списках, потом только их забивать.
 smile  


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
LSD
Дата 30.7.2006, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Bulat @  28.7.2006,  14:54 Найти цитируемый пост)
создавать, контейнеры-классы, списки, и работать не напрямую с БД, а с данными в списках, потом только их забивать.

А какая разница. Все равно UPDATE на одни и те же записи возможен, а в случае кумулятивного, шанс коллизий только возрастает.

А по поводу UPDATE, в компонентах dbExpress от Борланда реализованна следующая стратегия: производится UPDATE в условии WHERE которого указаны, все старые значения полей, и если хоть одно поле изменилось, то UPDATE затронет 0 полей, и пользователю будет выдана ошибка, что запись изменилась пока он "ковырялся в носу".

У нас же в системе все реализованно еще хитрей, есть 3 режима работы (у нас правда не СУБД, а своя система):
1. Все поля обновляются в реальном времени и если пользователь правит поле, а оно меняется, то его изменения будут потеряны.
2. Поля не обновляются, но в случае конфликта пользователь получит сообщение об ошибке.
3. Поля не обновляются, и все изменения прописываются поверху, невзирая на конфликты. 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0543 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.