Мы используем EJB 2.1 с сохраняемостью, управляемой контейнером, в IBM Websphere 8 и имеем следующую проблему: одиночный поиск объектов иногда возвращает 2 элемента, даже если в базе данных есть только один элемент для этого критерия поиска. Это происходит только тогда, когда несколько потоков обращаются к одной и той же записи базы данных.
Мы используем wsOptimisticUpdate в качестве намерения доступа. Внутри транзакции элемент сначала ищется с использованием бизнес-ключа (это средство поиска одного объекта, которое иногда находит 2 элемента и поэтому выдает исключение), а затем обновляется. Если несколько потоков делают это для одного и того же бизнес-ключа, возникает эта ошибка.
Используя точку останова для этого исключения и проверив незафиксированное чтение в базе данных, можно увидеть, что в базе данных есть только один элемент. Таким образом, похоже, что реализация CMP на самом деле не является потокобезопасной. Кто-нибудь сталкивался с такой проблемой раньше?
Caused by: javax.ejb.FinderException: Single object finder returned 2 objects.
at
com.ibm.ws.ejbpersistence.beanextensions.ConcreteBeanStatefulInstanceExtensionImpl.executeFind(ConcreteBeanStatefulInstanceExtensionImpl.java:1579)
at