Автор оригинала: Vlad Mihalcea.
В теории параллелизма блокировка используется для защиты изменяемых общих данных от опасных аномалий целостности данных. Поскольку управление блокировками является очень сложной проблемой, большинство приложений полагаются на свои методы поставщика данных неявной блокировки|/.
Делегирование всей ответственности за блокировку системе баз данных может как упростить разработку приложений, так и предотвратить проблемы параллелизма, такие как взаимоблокировка . Взаимоблокировки все еще могут возникать, но база данных может обнаруживать и принимать меры безопасности (произвольно освобождая одну из двух конкурирующих блокировок).
Физические блокировки
Большинство систем баз данных используют общие (чтение) и эксклюзивные (запись) блокировки, приписываемые определенным элементам блокировки (строкам, таблицам). В то время как физическая блокировка требуется стандартом SQL , пессимистический подход может препятствовать масштабируемости.
В современных базах данных реализованы облегченные методы блокировки, такие как MVCC .
Неявная блокировка базы данных скрыта за конфигурацией уровня изоляции транзакций. Каждый уровень изоляции поставляется с предопределенной схемой блокировки, направленной на предотвращение определенного набора аномалий целостности данных.
ПРИ ФИКСАЦИИ ЧТЕНИЯ используются общие блокировки на уровне запроса и эксклюзивные блокировки для измененных данных текущей транзакции. ПОВТОРЯЕМОЕ ЧТЕНИЕ и СЕРИАЛИЗУЕМОЕ использование общих блокировок на уровне транзакций при чтении и исключительных блокировок при записи.
Логические блокировки
Если блокировка базы данных достаточна для систем пакетной обработки, веб-поток с несколькими запросами охватывает несколько транзакций базы данных. Для длительных разговоров гораздо более уместен логический (оптимистичный) механизм блокировки.
В сочетании с повторяемым хранилищем для чтения на уровне разговоров оптимистичная блокировка может обеспечить целостность данных без масштабируемости торговли.
JPA поддерживает как оптимистическую блокировку , так и повторяемое чтение контекста сохранения, что делает его идеальным для реализации логических транзакций.
Хотя неявная блокировка, вероятно, является лучшим выбором для большинства требований к управлению параллелизмом приложений, могут возникнуть ситуации, когда вам потребуется более тонкая стратегия блокировки.
Большинство систем баз данных поддерживают директивы эксклюзивной блокировки во время запроса, такие как ВЫБРАТЬ ДЛЯ ОБНОВЛЕНИЯ или ВЫБРАТЬ ДЛЯ ОБЩЕГО ДОСТУПА . Поэтому мы можем использовать уровни изоляции по умолчанию более низкого уровня (ЧТЕНИЕ ЗАФИКСИРОВАНО), запрашивая общие или эксклюзивные блокировки для определенных сценариев транзакций.
Большинство реализаций оптимистической блокировки проверяют только измененные данные, но JPA также допускает явную оптимистическую блокировку.
В качестве уровня абстракции базы данных JPA может извлечь выгоду из неявных механизмов блокировки, предлагаемых базовыми СУБД. Для логической блокировки JPA также предлагает дополнительный механизм автоматического управления версиями сущностей.
JPA поддерживает явную блокировку для следующих операций:
- нахождение сущности
- блокировка существующего объекта контекста сохранения
- обновление сущность
- запрос через JPQL, критерии или собственные запросы
Явные типы блокировок
Тип LockModeType содержит следующие оптимистические и пессимистические режимы блокировки:
В отсутствие явной блокировки приложение будет использовать неявную блокировку (оптимистичную или пессимистичную). | НИКТО |
Всегда выдает проверку версии при фиксации транзакции, поэтому обеспечивает оптимистичную блокировку повторяемых считываний. | ОПТИМИСТИЧНЫЙ |
То же самое, что ОПТИМИСТИЧНО. | ЧИТАТЬ |
Всегда увеличивает версию сущности (даже если сущность не меняется) и выдает проверку версии при фиксации транзакции, тем самым обеспечивая оптимистичную блокировку повторяемых считываний. | OPTIMISTIC_FORCE_ИНКРЕМЕНТ |
То же самое, что и OPTIMISTIC_FORCE_INCREMENT. | ПИСАТЬ |
Общая блокировка приобретается для предотвращения получения любой другой транзакцией блокировки PESSIMISTIC_WRITE. | PESSIMISTIC_READ |
Эксклюзивная блокировка приобретается для предотвращения получения любой другой транзакцией блокировки PESSIMISTIC_READ или PESSIMISTIC_WRITE. | ПЕССИМИСТИЧНЫЙ_ПИСАТЬ |
Блокировка базы данных приобретается для предотвращения получения любой другой транзакцией блокировки PESSIMISTIC_READ или PESSIMISTIC_WRITE, и версия сущности увеличивается при фиксации транзакции. | PESSIMISTIC_FORCE_ИНКРЕМЕНТ |
Область блокировки и тайм-ауты
JPA 2.0 определил свойство javax.persistence.lock.scope , приняв одно из следующих значений:
- ОБЫЧНЫЙ
Поскольку графики объектов могут охватывать несколько таблиц, явный запрос на блокировку может распространяться более чем на одну таблицу (например, объединенное наследование, вторичные таблицы).
Поскольку все строки, связанные с сущностью, заблокированы, многие к одному и один к одному внешние ключи также будут заблокированы, но без блокировки родительских ассоциаций с другой стороны. Эта область не распространяется на дочерние коллекции.
- РАСШИРЕННЫЙ
Явная блокировка распространяется на коллекции элементов и таблицы соединений , но она не блокирует фактические дочерние сущности. Блокировка полезна только для защиты от удаления существующих дочерних элементов, позволяя при этом фантомное чтение или изменения состояний сущности фактических дочерних элементов.
JPA 2.0 также представил свойство javax.persistence.lock.timeout , позволяющее нам настраивать время (миллисекунды), в течение которого запрос на блокировку будет ждать, прежде чем выдавать Пессимистическое исключение блокировки .
Hibernate поддерживает все режимы блокировки JPA и некоторые дополнительные специальные опции блокировки. Как и в случае с JPA, явная блокировка может быть настроена для следующих операций:
- блокировка объекта с использованием различных Параметров блокировки настроек.
- получение сущности
- загрузка объекта
- обновление сущность
- создание сущности или собственного Запроса
- создание Критерия запроса
Конвертер Режимов блокировки обеспечивает отображение режимов блокировки JPA и гибернации следующим образом:
НИКТО | НИКТО |
ОПТИМИСТИЧНЫЙ | ОПТИМИСТИЧНОЕ ЧТЕНИЕ |
OPTIMISTIC_FORCE_ИНКРЕМЕНТ | ЗАПИСЬ OPTIMISTIC_FORCE_INCREMENT |
PESSIMISTIC_READ | PESSIMISTIC_READ |
ПЕССИМИСТИЧНЫЙ_ПИСАТЬ | PESSIMISTIC_WRITE ОБНОВЛЕНИЕ UPGRADE_NOWAIT ОБНОВЛЕНИЕ _СКИП ЗАБЛОКИРОВАН |
PESSIMISTIC_FORCE_ИНКРЕМЕНТ | ПЕССИМИСТИЧЕСКОЕ_НАПРЯЖЕНИЕ СИЛЫ |
Режимы ОБНОВЛЕНИЕ и ПРИНУДИТЕЛЬНАЯ блокировка устарели в пользу PESSIMISTIC_WRITE .
UPGRADE_НО ПОДОЖДАТЬ и UPGRADE_SKIP ЗАБЛОКИРОВАН используйте стиль Oracle выберите для обновления сейчас или выберите для пропуска обновления заблокирован синтаксис соответственно.
Область блокировки и тайм-ауты
Режим гибернации также определяет параметры блокировки области и времени ожидания :