Я использую Hibernate 2.6 с hibernate-entitymanager. Я пытаюсь поймать и обработать ситуации, когда 2 транзакции конфликтуют с объектом. Вот что происходит:Как обнаружить конфликты транзакций с Hibernate?
Два потока обновляют один объект, у которого есть поле @Version. Поток, который теряет фиксацию журнала гонок StaleObjectStateException на флеш. Исключение не выбрасывается, оно только регистрируется. Я предполагаю, что транзакция отмечена откатом - только в этот момент.
После этого, когда поток пытается выполнить commit, он не работает с RollbackException. Я не нашел способа узнать в коде, почему транзакция откатывается назад.
Есть ли способ поймать и обработать такие ситуации в коде? В основном я хочу поймать StaleObjectStateException, но проблема в том, что она не выбрасывается.
UPDATE: То, что я пытаюсь сделать с высоты птичьего полета выглядит следующим образом:
У меня есть приложение J2EE, работающее под управлением JBoss. Он имеет некоторые внутренние службы, вызванные таймером, и те, которые вызываются из пользовательского интерфейса. Он также имеет одну критическую сущность. Мне нужно убедиться, что разные потоки не могут одновременно обновлять объекты этого класса сущности, поскольку это может привести к несогласованности данных. Вот почему я реализую оптимистичную блокировку.
Когда возникает проблема блокировки с оптимизацией, я стараюсь в целом справиться с этой ситуацией. Я хочу поймать его на очень высоком уровне и показать правильное сообщение пользователя (в моем случае самый высокий уровень - ExceptionMapper для RestEasy). Проблема в том, что когда я поймаю RollbackException, уже слишком поздно.
Не ручаю вручную. Большинство моих EJB используют CMT, и сеансы автоматически очищаются.
Я обновил свой ответ на основе вашего разъяснения – ChssPly76