У меня есть следующий код (OLE = OptimisticLockException)
...
public void outer() {
try {
middle()
} catch (OLE) {
updateEntities();
outer();
}
}
@Transactional
public void middle() {
try {
inner()
} catch (OLE) {
updateEntities();
middle();
}
@Transactional
public void inner() {
//Do DB operation
}
inner()
, который вызывается другими нетранзакционными методами, поэтому и middle()
, и inner()
являются транзакционными.Как видите, я имею дело с OLE, обновляя сущности и повторяя операцию.
Проблема, с которой я сталкиваюсь, заключается в том, что когда я проектировал вещи таким образом, я предполагал, что единственный раз, когда можно было получить OLEбыл когда сделка закрыта.По-видимому, это не тот случай, когда вызов inner()
вызывает OLE, даже когда стек равен outer()->middle()->inner()
.
Теперь middle()
правильно обрабатывает OLE, и повторная попытка завершается успешно, но когда это происходитВремя закрытия транзакции было отмечено rollbackOnly
Spring.Когда вызов метода middle()
наконец возвращает закрывающий аспект, возникает исключение, потому что он не может зафиксировать транзакцию, помеченную rollbackOnly
.
Я не уверен, что здесь делать.Я не могу очистить состояние rollbackOnly
.Я не хочу заставлять создавать транзакцию при каждом обращении к внутреннему, потому что это убивает мою производительность.Я что-то упустил или кто-нибудь может увидеть, как я могу структурировать это по-другому?
РЕДАКТИРОВАТЬ: Чтобы уточнить, что я спрашиваю, позвольте мне объяснить мой главный вопрос.Можно ли перехватить и обработать OLE, если вы находитесь внутри метода @Transactional?
К вашему сведению: диспетчер транзакций - это JpaTransactionManager, а провайдер JPA - Hibernate.