Обработка одновременных обновлений в спящем режиме - PullRequest
22 голосов
/ 01 сентября 2010

В настоящее время мы используем JDBC на уровне данных и планируем заменить его на Hibernate. Я новичок в Hibernate и не уверен, как Hibernate обрабатывает параллелизм. Может ли кто-нибудь объяснить мне, если мы используем Spring для управления транзакциями, как будут обрабатываться параллельные обновления: с помощью hibernate (в памяти для автоматического управления версиями hibernate) или мне нужно поместить столбец версии в базу данных, чтобы вручную позаботиться о одновременных обновлениях.

Ответы [ 4 ]

52 голосов
/ 01 сентября 2010

Может ли кто-нибудь объяснить мне, если мы используем Spring для управления транзакциями, как параллельные обновления будут обрабатываться hibernate (в памяти для автоматического управления версиями hibernate) или мне нужно поместить столбец версии в базу данных, чтобы позаботиться оодновременные обновления вручную.

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

Оптимистическая

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

Чтобы проиллюстрировать, как это работает, давайте представим, что вы загружаете сущность Person с id = 1 и с текущей версией = 1.После сохранения Hibernate выполнит что-то вроде этого:

update PERSON set ID=1, NAME='NAME 1', VERSION=2 where ID=1 and VERSION=1;

Итак, теперь представьте, что у вас запущены две параллельные транзакции, каждая из которых загружает один и тот же объект (тот же номер версии)и изменив имя.

Допустим, транзакция # 1 фиксируется первой, выполняется следующий запрос:

update PERSON set ID=1, NAME='NAME 1', VERSION=2 where ID=1 and VERSION=1;

Успешно, и версия увеличивается.

Затемтранзакция # 2 зафиксирована, выполняется следующий запрос:

update PERSON set ID=1, NAME='NAME 2', VERSION=2 where ID=1 and VERSION=1;

Этот запрос ничего не обновит, поскольку предложение where не будет соответствовать ни одной записи.Именно здесь вы получите исключение для оптимистичного параллелизма.

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

Пессимистический

При использовании пессимистической блокировки Hibernate блокирует запись для вашего эксклюзивного использования, пока вы не получитезакончил с этим (обычно используя SELECT ... FOR UPDATE).Любая другая параллельная транзакция, пытающаяся получить доступ к той же записи, будет приостановлена ​​до снятия блокировки.Эта стратегия обеспечивает лучшую предсказуемость, ценой производительности и не масштабируется бесконечно.

Ссылки

1 голос
/ 13 сентября 2017

Существуют реализации JPA, такие как objectDB, в которых по умолчанию активирована оптимистическая блокировка, и пользователю не нужно поддерживать переменную версии в таблице базы данных, так как она внутренне обеспечивается ObjectDB. Оптимистическая блокировка хороша в тех случаях, когда обновления происходят не часто, а блокировка сопряжена с неявными затратами, как в случае электронной коммерции, где блокировка означает потерю бизнеса. Пессимистическая блокировка идеальна, когда параллелизм не так востребован и транзакция завершена быстро, чтобы освободить ресурс.

0 голосов
/ 01 сентября 2010

Hibernate обрабатывает версионирование самостоятельно, здоровое предложение - вообще не вмешиваться в номер версии.

Подробнее о версиях в Hibernate

Общее, но простое руководство

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...