StaleObjectException, но действительно странно

Я унаследовал приложение, которое выполняет вставки и обновления, основанные на триггерах, и иногда выдает исключение StaleObjectException. Я попытался добавить много отладки (tx,hibernate,type и т. Д.), Что еще больше запутало меня.

15:21:00 Calling dao.insert
15:21:00 starting Trancation T1 
15:21:01 insert records including object #290595
15:21:01 Transaction T1 commits

Я вижу фиксацию tx в журналах, вставках гибернации и данных, и действительно, объект с идентификатором #290595 связан как значение. Аналогичная вставка есть в 15:24:00, но до 15:25:00 приложение полностью отключается (нет пользователя, нет других действий).

15:25:00 Start a Required_new transaction T2
15:25:00 Calling dao.finder
15:25:01 dao transaction uses propagated T2
15:25:01 Select returns object with id #290595
15:25:01 ends propagated transacted finder
15:25:02 calling dao.update
15:25:02 dao transaction uses propagated T2
15:25:02 binds object with id #290595
15:25:02 Could Not Synchronize Database State With Session (StaleObjectStateException)

SQL-запрос в базе данных показывает, что запись #290595 на самом деле не существует. Есть 4 минуты между вставкой и отказом. Само собой разумеется, что обычно работает большую часть дня, но вдруг....

Разве гибернация не будет автоматически сбрасываться и фиксироваться при транзакции

Я предполагаю, что вставки переместили данные в кеш, но не в БД, снова нашли в кеше, но отказываются обновляться, потому что их нет в БД. Так что вопрос в том, есть ли у кого-нибудь отличные идеи?

Это БД оракула, и я пытался убедиться, что в T2 есть транзакция Required_new и с сериализацией изоляционного уровня, но с небольшим эффектом... Я начинаю думать, что вставки почему-то оставляются незафиксированными,?!

Любые предложения приветствуются

1 ответ

Решение

Ну, я нашел ответ сам.

Я наткнулся на Javadoc для StaleObjectStateException в Hibernate версии 2:

Thrown when a version number or timestamp check failed, indicating that the Session 
contained stale data (when using long transactions with versioning). Also occurs
if we try delete or update a row that does not exist.

Я всегда предполагал второе, никогда не глядя на первое.. Версия действительно была меткой времени, и после прочтения этой статьи я также изменил атрибут версии на long, и сразу все ошибки исчезли. Не уверен насчет несоответствия, но это не имеет значения для логики приложения, так что..?

Почему кто-то хочет использовать метку времени для управления версиями?

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