LockModeType.OPTIMISTIC_FORCE_INCREMENT — это блокировка, выполняемая на уровне приложения или на уровне базы данных

Вопрос:

В случае спящего режима jpa LockModeType.OPTIMISTIC_FORCE_INCREMENT это блокировка выполняется на уровне приложения или на уровне базы данных.

Я использую следующий фрагмент для принятия оптимистических блокировок:

setting = this.entityManager.find(Setting.class, setting.getId(),
LockModeType.OPTIMISTIC_FORCE_INCREMENT);
setting.setUpdateTimestamp(new Date());
newSettingList.add(setting);

Предположим, что два jvm работают, и оба имеют одинаковые методы, и есть конфликт, будет ли этот механизм блокировки работать в этом случае?

Мое замечание состоит в том, что всякий раз, когда я отлаживался и «newSettingList.add (настройка)»; в этой строке в коде я не видел никаких изменений в базе данных в этот момент. Итак, как блокировка обеспечивается на уровне базы данных?

Лучший ответ:

Оптимистическая блокировка — это стратегия, в которой вы читаете запись, используйте номер версии, чтобы проверить, не изменилась ли версия до того, как вы напишете запись. Когда вы записываете запись, вы фильтруете обновление в версии, чтобы убедиться, что оно атомарно.

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

Лучшее объяснение здесь.

Это означает, что, поскольку вы используете оптимистичную блокировку, вы не вмешиваетесь в блокировки на уровне базы данных. То, что вы делаете, просто использует базу данных для поддержания версий объектов-объектов. Например:

a) Вы открываете транзакцию T1 с 1-го jvm и читаете объект с версией v1.

б) Вы открываете транзакцию T2 со второго jvm и читаете один и тот же объект с v1. (обновление в этом объекте не производится).

c) Вы обновляете в транзакции T1 объект и устанавливаете его версию v2. вы совершаете транзакцию.

d) Вы пытаетесь получить доступ снова в db для объекта, но вы получаете исключение из-за версии.
Но нет необходимости иметь доступ с одного и того же jvm для двух транзакций

Оцените статью
TechArks.Ru
Добавить комментарий