Оптимистичные блокирующие блоки на Websphere

У меня проблемы с оптимистической блокировкой в ​​JPA с использованием WAS 8.0.7. У меня есть веб-проект, использующий EJB 3 + JPA 2 (SQL Server, источник данных XA). У меня есть две сущности JPA X и Y.

X имеет отношение OneToMany к Y.

Обе сущности имеют поле @Version (и в соответствующих таблицах SQL есть столбец версии).

Хотя это по умолчанию, я установил <property name="openjpa.LockManager" value="version"/> в файле persistence.xml

Я сохраняю сущность X внутри метода x() EJB без сохранения состояния, использующего управляемые транзакции контейнера.

Метод x() создает и сохраняет сущность X и продолжает выполнять некоторую бизнес-обработку на X, пока не вернется.

Допустим, метод x() вызывается из нескольких веб-запросов.

Первый запрос вызывает x() и создает X-сущность.

Между тем, если второй запрос вызывает метод x(), он блокируется, пока первый запрос не будет завершен.

Это правильное поведение с использованием оптимистической блокировки? Разве второй запрос не должен продолжаться и выдавать исключение OptimisticLockException в случае одновременного обновления?

Вместо этого он просто блокирует, как будто использует пессимистическую блокировку.

1 ответ

Проверьте настройки уровня изоляции источника данных ( http://pic.dhe.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=%2Fcom.ibm.websphere.express.doc%2Finfo%2Fexp%2Fae%2Frdat_isolevtab.html)

Рычаг высокой изоляции может заблокировать все таблицы, на которые есть ссылки (например, selectред) в транзакции до конца.

Другие вопросы по тегам