Java Platform, Enterprise Edition (Java EE) 8
Учебник по Java EE

Назад Вперёд Содержание

Обзор блокировки сущностей и параллелизма

Доступ к данным объектов сущностей осуществляется параллельно, если к данным в источнике данных обращаются одновременно несколько приложений. Убедитесь, что целостность данных сохраняется при параллельном доступе к ним.

Когда данные обновляются в таблицах базы данных в транзакции, persistence provider предполагает, что система управления базами данных будет поддерживать кратковременные блокировки чтения и долгосрочные блокировки записи для поддержания целостности данных. Большинство persistence provider-ов задерживают запись в базу данных до конца транзакции, за исключением случаев, когда приложение явно требует принудительной записи (то есть приложение вызывает метод EntityManager.flush или выполняет запросы с установленным режимом очистки в AUTO).

По умолчанию persistence provider-ы используют оптимистичную блокировку, когда перед фиксацией изменений в данных persistence provider проверяет, что никакая другая транзакция не изменила или не удалила данные с момента их чтения из базы данных. Это достигается с помощью столбца версии в таблице базы данных с соответствующим атрибутом версии в классе сущности. Когда запись изменяется, значение версии увеличивается. Исходная транзакция проверяет атрибут версии, и, если данные были изменены другой транзакцией, генерируется javax.persistence.OptimisticLockException, а исходная транзакция откатывается. Когда приложение задаёт режимы оптимистичной блокировки, persistence provider проверяет, что конкретный объект не изменился, поскольку он был прочитан из базы данных, даже если данные объекта не были изменены.

Пессимистичная блокировка идёт дальше, чем оптимистичная. При пессимистичной блокировке persistence provider создаёт транзакцию, которая получает долговременную блокировку данных до её завершения, что не позволяет другим транзакциям изменять или удалять данные до тех пор, пока блокировка не будет завершена. Пессимистичная блокировка — лучшая стратегия, чем оптимистичная блокировка, когда к базовым данным часто обращаются и изменяют многие транзакции.

Примечание:

Использование пессимистичних блокировок для объектов, которые не подлежат частой модификации, может привести к снижению производительности приложения.

Использование оптимистичной блокировки

Используйте аннотацию javax.persistence.Version, чтобы пометить персистентное поле или свойство как атрибут версии объекта. Атрибут версии включает объект для оптимистичного управления параллелизмом. Persistence provider считывает и обновляет атрибут версии, когда объект изменяется во время транзакции. Приложение может прочитать атрибут версии, но не должно изменять значение.

Примечание:

Хотя некоторые persistence provider-ы могут поддерживать оптимистичную блокировку для объектов, которые не имеют атрибутов версии, переносимые приложения всегда должны использовать объекты с атрибутами версии при использовании оптимистичной блокировки. Если приложение пытается заблокировать объект, у которого нет атрибута версии, а persistence provider не поддерживает оптимистичную блокировку для объектов без контроля версий, будет выдано PersistenceException.

Аннотация @Version имеет следующие требования.

  • Только один атрибут @Version может быть определён для каждой сущности.

  • Атрибут @Version должен находиться в первичной таблице для сущности, сопоставленной с несколькими таблицами.

  • Тип атрибута @Version должен быть одним из следующих: int, Integer, long, long, short, Short или java.sql.Timestamp.

В следующем фрагменте кода показано, как определить атрибут версии в объекте с персистентными полями:

@Version
protected int version;

В следующем фрагменте кода показано, как определить атрибут версии в объекте с персистентными свойствами:

@Version
protected Short getVersion() { ... }

Назад Вперёд Содержание
Логотип Oracle  Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены. Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)