![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 16 Всего: 151 |
Всем привет,
Многие классы приложений постоянно сталкиваются с проблемой конкурентного апдейта, то есть синхронизацией записи. Сценарий следующий: 1) Юзер 1 открывает запись на редактирование и меняет её (для усложнения задачи допустим, что речь идет о десктоп-клиенте) 2) Юзер 2 открывает ту же запись на редактирование 3) Юзер 1 нажимает "сохранить". Запись сохраняется в базу. 4) Юзер 2 нажимает "сохранить". Запись сохраняется в базу, перетирая изменения от юзера 1. Как решать такую проблему? Я надеялся, что JPA имеет такой механизм, но, похоже, был не прав. Вообще, проблема эта популярная, поэтому наверняка существуют и паттерны её решения, и библиотеки с подобными возможностями. Помогите советом или ссылками. Мои соображения: 1) сейчас у нас за разрешение подобных конфликтов отвечает механизм stamp'ов, т.е. каждая запись имеет номер, инкрементально увеличивающийся при апдейте. Если юзер 2 хочет проапдейтить запись, но видит, что её stamp поменялся со времени загрузки, он возвращает ошибку. Но с обязанностями своими наш фреймворк справляется плохо - нетривиальные случаи использования типа кеширования или иерархической зависимости объектов (когда изменение стемпа одного объекта вызывает изменение стемпа другого) вызывают множественные side-эффекты. Хотя дело тут, во многом, в кривой реализации, а не в порочности идеи стемпов, всё таки не хочется изобретать велосипед, если он уже кем-то изобретен. 2) Другой подход - лочить запись на уровне базы, когда отдаем её кому-то на редактирование (SELECT FOR UPDATE). Но в таком случае оператор, оставивший запись залоченной перед уходом на обед, блокирует работу остальных (Stampede в свое время называл это "проблемой ковыряния в носу"). -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: 7 Всего: 54 |
Так же. Руками. -------------------- ![]() ![]() |
|||
|
||||
kkorsakoff |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 378 Регистрация: 18.10.2005 Где: Санкт-Петербург Репутация: 6 Всего: 14 |
Так Hibernate вроде бы умеет? Version в хмл конфигурации. Насколько я знаю в JPA при использовании Hibernate в качестве провайдера можно использовать все его фичи. Честно говоря не пробовал, но в документации бегло читал про это.
|
|||
|
||||
mindflyer |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 113 Регистрация: 20.10.2004 Где: Smolensk, Russia Репутация: 3 Всего: 4 |
Используем версионность хибернейта - по сути те самые stamp'ы и есть. Жалоб не имеем
![]() Плюс для ряда случаев у нас имеется собственный механизм блокировок - при начале редактирования устанавливается лок на объект (создаётся спец. запись в бд с указанием кто залочил, когда и т.п.), при закрытии редактора лок снимается. Но это уже к бизнесс-процессам имеет отношение, а не к согласованности данных. |
|||
|
||||
batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 16 Всего: 151 |
Заценим-с, спасибо.
-------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
Asal |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 288 Регистрация: 26.12.2006 Где: Минск Репутация: 4 Всего: 7 |
batigoal, поделитесь успехами.
Что-нибудь получилось ? |
|||
|
||||
powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 28 Всего: 159 |
Ищите книгу Мартина Фаулера "Архитектура корпоративных программных приложений". Там целая глава посвещена блокировкам.
Optimistic Offline Lock Pessimistic Offline Lock Coarse-Grained Lock Implicit Lock |
|||
|
||||
alexadr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 25.9.2006 Репутация: нет Всего: 4 |
||||
|
||||
Asal |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 288 Регистрация: 26.12.2006 Где: Минск Репутация: 4 Всего: 7 |
Нашел. книга тут. powerOn, спасибо за совет, буду читать. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |