Может ли кто-нибудь объяснить мне, если мы используем 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
).Любая другая параллельная транзакция, пытающаяся получить доступ к той же записи, будет приостановлена до снятия блокировки.Эта стратегия обеспечивает лучшую предсказуемость, ценой производительности и не масштабируется бесконечно.
Ссылки
- Справочное руководство по Hibernate Core