Это очень скромный вопрос.
В некоторых статьях указывается, что всегда следует использовать транзакции базы данных, даже для простых операций чтения. Вот произвольный пример, который имеет для меня большой смысл: http://nhprof.com/Learn/Alerts/DoNotUseImplicitTransactions В самой документации Hibernate также сказано:
Всегда используйте четкие границы транзакции, даже для операций только для чтения.
ОК, кажется достаточно ясным. Это всегда было моим предположением, а именно. что поскольку транзакции в любом случае будут применяться неявно на уровне базы данных во всех случаях, вероятно, лучше всегда объявлять их явно.
Затем я читаю другие статьи, подобные этой: http://www.ibm.com/developerworks/java/library/j-ts1/index.html#never (обратите внимание на выноску). В этой статье говорится, частично:
Никогда не говори никогда
В определенные моменты может потребоваться запустить транзакцию для операции чтения базы данных, например, при изоляции ваших операций чтения для согласованности или при установке определенного уровня изоляции транзакции для операции чтения. Однако в бизнес-приложениях такие ситуации встречаются редко, и если вы не сталкиваетесь с ними, вам следует избегать запуска транзакции для операций чтения из базы данных, поскольку они не нужны и могут привести к взаимоблокировкам базы данных, низкой производительности и низкой пропускной способности.
Немного о тупиках и плохой пропускной способности также имеет смысл для меня.
Конфликтующие советы на самом низком уровне. Это нормально; как скромный разработчик приложений, я могу решить, что предпочитаю прежний совет, возможно, посмотреть, достигнет ли данная комбинация ORM / базы данных лучшей производительности без транзакции в определенных критических для производительности случаях. Пожалуйста, поправьте меня, если я ошибаюсь.
Теперь я возвращаюсь в область сервера приложений и транзакций XA.
Если у меня есть метод EJB, который выполняет операции только для чтения, то будет ли хорошей практикой всегда объявлять его транзакционным (следуя духу рекомендаций Hibernate выше)? Или пометить его как @TransactionAttribute(TransactionAttributeType.SUPPORTS)
не очень много о стратегии транзакций базы данных рядом с металлом?
Я имею в виду, что транзакция EJB (JTA) происходит на уровне сервера приложений. Может случиться так (я не знаю), что когда сервер приложений Java EE взаимодействует с Hibernate, Hibernate всегда будет принудительно выполнять явные транзакции на уровне базы данных, независимо от действующей политики транзакций на уровне приложений. Поэтому статьи, посвященные Hibernate, которые я привел здесь, могут не относиться к транзакции JTA уровня сервера приложений - возможно, - это хорошая практика, чтобы помечать методы только для чтения как @TransactionAttribute(TransactionAttribute.SUPPORTS)
вместо REQUIRED
.
Что здесь думают люди? Все указатели - даже на элементарную информацию - приветствуются.