Обновление в REQUIRES_NEW, затем поиск в другой транзакции возвращает старые данные. Зачем?
Этот вопрос лучше всего описать картинкой, я думаю. Я надеюсь, что кто-то может помочь мне. Спасибо http://img341.imageshack.us/img341/7643/mockup.png
2 ответа
Я согласен с Паскалем, если два вызова из EJB1 находятся в одной транзакции, то ясно, что (2) не может видеть изменения, выполненные (1), потому что они были выполнены в другой транзакции (конечно, при условии разумного уровня изоляции транзакции)
1. EJB1 transaction (TX1) starts
2. EJB1.(1) called
3. EJB2.update row started => TX1 is suspended and
a new transaction, TX2, is started
4. The update is performed
5. TX2 commits
6. TX1 is resumed - it can't see changes by TX2 because it's isolated from
changes performed by other transactions during its "life"
7. EJB1.(2) invokes EJB2.find row withing the context of TX1 => can't see TX2's changes
8. TX1 commits
Я не уверен, что вы указали весь контекст, но если (1) и (2) выполняются внутри одной транзакции, я бы сказал, что сущность находится в кеше L1, это то, что предлагает вопрос, и что изменения сделаны в " строка обновления " не видна, потому что они были сделаны в другом постоянном контексте (вложенная транзакция), следовательно, необходимо refresh
состояние экземпляра из базы данных.