2015-02-27 4 views
0

Извините, если ответ уже был ответом, но я попытался выяснить это решение, и я еще не нашел ничего ясно.Hibernate LAZY Fetch VS Оптимистичная блокировка версии

Мой вопрос в том, что между отношениями LAZY fetch существуют отношения, которые, как я знаю, у них есть контроль, чтобы знать, должны ли они подключаться к другим объектам или не инициализировать их из базы данных, если они грязны во время сеанса, принцип оптимистической блокировки VERSION ?.

Насколько я понимаю, оптимистическая блокировка VERSION является более необходимой, если нам приходится обрабатывать сразу несколько транзакций. Это верно?.

Если все транзакции, которые мы делаем в наших приложениях, выполняются последовательно, достаточно использовать LAZY fetch для управления, когда должны выполняться JOINS ?. Или добавьте версию, добавив ценность.

Спасибо!

ответ

2

Это две совершенно разрозненные концепции. Вы получаете только «ленивую нагрузку», если получаете или устанавливаете лениво загруженные отношения.

Если вы используете оптимистичную блокировку и ваша строка находится на V2, она просто препятствует передаче измененного V2 с одного клиента (что приводит к увеличению версии до 3), а затем другому V2 от другого клиента, принуждению чтобы перезагрузить данные и отправить более позднюю версию.

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

Итак, разные проблемные пространства целиком.

Если вы пытаетесь обновить очень сложный графа объектов, в котором ваши изменения углубляются в этот граф, вы можете столкнуться с интересными оптимистичными проблемами блокировки, поскольку обеспечение «версии» всего дерева является очень сложным.

ОБНОВЛЕНИЕ: для уточнения.

Если у вас есть автомобиль (который имеет уникальные свойства, такие как марка, модель, регистрационный номер) и колеса в несколько раз. Это будет соотношение 1: 0..n, представленное в виде двух таблиц, стол для автомобилей и стол для колес, где колесо имеет FK обратно в автомобиль. (Для целей этого сообщения мы будем игнорировать отношения «многие ко многим»).

Если вы ленитесь, загрузите свои колеса, тогда, если вам не интересно, если у вас есть обоймы, шины, стопорные гайки и т. Д., Вам никогда не понадобится загрузка колес, они не актуальны, если вам нужен только регистрационный номер ,

Ваша запись автомобиля на V1, имеет регистрационный номер AB1212

Если я, как регистратор Vehicle Молдовы обновить его AC4545 и представить с V1 (текущая версия), мне удастся и номер версии будет увеличен. Я не буду ударять по Колесам, если мне это не понадобится. Если в то же время регистратор Subaltern Vehicle в другой комнате пытается сделать то же самое на V1, он будет терпеть неудачу с исключением StaleObjectException, опять же, не ударяя по Колесам и, таким образом, не будет ссылаться на ленивую нагрузку.

+0

Но тогда, если я понимаю, что вы сказали, если у меня есть все мои отношения как ЛАЗИ, оптимистическая блокировка лишняя? – paul

+0

Нет, это неверно. См. Править. –

+0

«Регистратор Субалтерн-транспортного средства в другой комнате» является другим правом сделки ?. Но, как я объясняю в моем случае, нет параллельных транзакций, поэтому этот вопрос никогда невозможен, поэтому оптимистическая блокировка избыточна. Извините, если я продолжу пропустить что-то :) – paul

0

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

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

Это, как говорится, вы пытаетесь сравнить два (функционально) очень разные вещи ...

Надеются, что это помогает.

Смежные вопросы