![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Sherst |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 131 Регистрация: 26.10.2005 Репутация: нет Всего: 2 |
Привет всем!
Ребят, кто как решал проблему многопользовательского доступа и на какие грабли при этом наступали. Сам думаю использовать запрос select for update. Т.е. на Java будет выглядеть примерно так:
В качестве сервера баз данных использую Oracle. |
|||
|
||||
| powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 47 Всего: 159 |
Не могу понять, в чем проблема-то?
|
|||
|
||||
| Sherst |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 131 Регистрация: 26.10.2005 Репутация: нет Всего: 2 |
Если 2 человека попытаются одновременно отредактировать одну запись в таблице, то результат будет
плачевным ... |
|||
|
||||
| w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: 20 Всего: 54 |
Способы объехать такую несправедливость, как одновременные запросы на update:
-------------------- ![]() ![]() |
|||
|
||||
| Stampede |
|
|||
![]() Гносеолог ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 963 Регистрация: 25.4.2005 Где: Calgary, Alberta, Canada Репутация: 24 Всего: 144 |
Стоп-стоп-стоп, товарищи. Тут далеко не все так просто.
На самом деле выбор стратегии обнаружения и разрешения конфликтов многопользовательского доступа очень сильно зависит от типа проги, и самое главное - от используемых в ней сценариев доступа к данным. Если выборка и обновление происходят в рамках одной транзакции, то тут все достаточно просто. Можно, как уже упоминалось, воспользоваться конструкцией select for update (хотя это и некошерно в силу непереносимости). Гораздо удобнее ввести внешнюю синхронизацию: через примитивы синхронизации Java или через атрибуты управления транзакциями (если речь идет о компонентной архитектуре). Тут все основывается на предположении, что транзакции короткие и быстрые. Гораздо хуже, если сценарий предполагает между чтением и записью какие-то действия пользователя. Сложность тут в том, что в этом случае категорически недопустимо вводить какую-бы то ни было блокировку, потому что никто не знает наперед, как долго юзер будет держать форму открытой (например, уйдет на обед). Это то, что я называю фактором "ковыряния в носу" Между тем конфликты - вещь абсолютно реальная. Расмотрим такую, очень даже возможную, ситуацию:
Как с этим бороться? Ну, есть разные способы, но вот легких среди них - увы, нет. Перечислю несколько наиболее распространенных. Избирательное обновление Предлагается отлавливать, какие именно поля были изменены, и делать апдейт только этих полей. Как вариант, изменения не отлавливать, а сохранять копию исходной записи и изменения обнаруживать путем сравнения. Недостаток в том, что вместо одного общего апдейта придется писать команды для обновления каждого поля. "Версирование" записей В таблице заводится дополнительное поле - метка, указывающая на версию записи. При каждом обновлении номер версии никрементируется (это можно сделать и триггером). При поступлении запроса на обновление читается текущий номер версии и сравнивается с тем, что пришел с запросом. Если не совпадает - юзеру возвращаются свежие данные с просьбой повторить ввод инфы. Недостаток: усложнение сценариев диалога. В принципе можно придумать массу и других способов. Кроме того, описанные способы тожу не универсальны и там может быть куча разных нюансов. Что, например, если редактирование в том числе предполагает добавление/удаление записей в связанной таблице? Поэтому все что я хотел - это дать более расширенное описание проблемы и накидать общие пути решения. А если хочешь более конкретного совета - выкладывай исходные данные. Это сообщение отредактировал(а) Stampede - 27.7.2006, 23:03 -------------------- "If you want something done right, do it yourself" По секрету: выучить английский - реально! |
|||
|
||||
| Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 4 Всего: 57 |
А если прибегнуть к некоторым конструкциям хибернэйта
Опыта не много, но кажется очень хорошо решается подобная проблема, причем использование самого хибернэйта совсем не обязательно -------------------- менеджер по кодеврайтингу |
|||
|
||||
| tux |
|
|||
![]() Летатель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 31 Всего: 132 |
Это как это? Использовать конструкции Hibernate не используя сам Hibernate? Объясни. "Версирование" записей в Hibernate реализовано. Если проект позволяет, можно использовать. Сделать оптимально избирательное обновление мне кажется уж слишком сложно. |
|||
|
||||
| Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 4 Всего: 57 |
создавать, контейнеры-классы, списки, и работать не напрямую с БД, а с данными в списках, потом только их забивать.
-------------------- менеджер по кодеврайтингу |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
А какая разница. Все равно 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. |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |