Существуют опции для управления транзакционным поведением EJB.Обычно они имеют параметр «Требуется транзакция», так что, если бин вызывается с действующей транзакцией, то работа бина включается в уже установленную транзакцию, в противном случае транзакция будет начата и завершена, когда бин вернется.
В вашем коде при входе в EJB транзакция не выполняется, поэтому, как вы говорите, при возврате из EJB любая транзакция была разрешена.
Хотя это кажется потенциально проблематичным, поскольку выпотенциально получить противоречивые представления данных, я думаю, что это поведение желательно.Мы хотим, чтобы время, затрачиваемое на транзакцию, было коротким - в противном случае блокировки базы данных удерживаются в течение длительных периодов и, следовательно, страдает параллелизм.
Уровень EJB следует рассматривать как обеспечивающий атомарные сервисы, который разработан и используется соответствующим образом.Я не знаю, правильно ли я читаю ваш код, но использование отдельных методов доступа для заголовка и тела может быть не лучшим вариантом.Если вам нужна согласованность между заголовком и извлечением из тела, все данные в одном вызове могут быть предпочтительны, и на самом деле более эффективно это делается в одном взаимодействии с БД.
- добавлено --- Вы уточнили в своем вопросе, что выдействительно обеспокоены согласованностью между различными частями экрана, которая в случае кодирования с использованием простых методов JSF будет использовать отдельные транзакции.
По моему мнению, подход JSF по умолчанию является приемлемым, когда такие несоответствия либо маловероятны, либо неизбежны.Примеры: 1).Маловероятно: запрашивать исторические данные, общее количество вчерашних транзакций и список вчерашних транзакций.В системе, где история не может изменить, такие отдельные запросы будут согласованы.2).Неизбежно: сводные данные поступают из одной системы, подробности из другой системы, между этими двумя системами нет координации транзакций, мы не можем обеспечить согласованность.Мы просто должны предоставить пользователю указания на то, что эти два представления могут быть немного несогласованными.
Если вы действительно хотите согласованности, используйте другой подход, получите все данные в одном запросе и сохраните их (скажем, в сеансе или запросе), а затем используйте их в двух представлениях - представления не должны извлекать свои собственные данныеесли вы заботитесь о таких вещах.
Я думаю, вы обнаружите, что попытки использовать транзакции для обеспечения согласованности будут значительно усложнять и влиять на пропускную способность.Проблема с координацией транзакций между представлениями заключается в том, что нет простого «владельца», если вы перекомпоновали страницу, вам нужно будет изменить логику