Оптимистичные блокирующие блоки на 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
ред) в транзакции до конца.