Что я делаю
У меня есть система async
, которая реагирует всякий раз, когда в системе main
создается новый объект, и эта система async
запрашивает базу данных для вновь созданных объектов.
Как я это делаю
Для создания сообщений для системы async
я использую hibernate interceptor
.
Поэтому всякий раз, когда создается новый объект, вызывается метод onSave
перехватчика, и я
сохранить идентификатор объекта в list
, и теперь, когда afterTransactionComplete(Transaction tx)
вызвал, я очищаю все entity id
в системе от list
до async
, используя систему обмена сообщениями (ActiveMq).
В чем проблема
Теперь problem
возникает, когда в процессе находится более одной транзакции.. и обе
транзакции создают сущности.
Позвольте мне привести пример:
Tx_A
создать объект EA1, EA2
.
Tx_B
создает сущность EB1, EB2
.
Теперь предположим, что поток выполнения происходит следующим образом:
[1] при сохранении для EA1 я добавляю идентификатор EA1 в flushList
[2] при сохранении для EB1 я добавляю идентификатор EB1 в flushList
[3] afterTransactionComplete(tx) для Tx_A
Теперь в этот момент я сброшу EA1 and EB1
id в async
систему, которая при запросе базы данных
для EB1
найдено нулевое значение, так как транзакция Tx_B
еще не завершена.
Теперь эту проблему можно решить, если в вызове onsave
я могу получить идентификатор транзакции, а затем в afterTransactionCompletion
я могу сбросить только объект, связанный с этой транзакцией.
[1] Теперь есть ли способ получить идентификатор этой транзакции?
[2] Есть ли другое решение вышеуказанной проблемы?
я использую спящий режим 4.2.2