Когда использовать транзакции в Spring с Hibernate?

Обновляя свой проект, я думаю о транзакциях.
Дело в том, что я не совсем уверен, когда мне следует использовать транзакции для запросов Hibernate в Spring.
Не то чтобы Я совершенно не понимаю, что такое транзакции, наверное, понимаю, но
Нужно ли мне использовать транзакции для запросов типа get*, просто установив атрибут read-only?

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <!-- all methods starting with 'get' are read-only -->
        <tx:method name="get*" read-only="true" />
        <!-- other methods use the default transaction settings -->
        <tx:method name="*" />
    </tx:attributes>
</tx:advice>

Эффективно ли это для запросов get*?
Потому что, насколько я думаю, использование транзакций должно выполняться так же, как для запросов CREATE, UPDATE, DELETE и подобных.
Я что-то упустил?


person Rihards    schedule 13.05.2011    source источник
comment
связанные stackoverflow.com/questions/13539213/   -  person ahmednabil88    schedule 27.05.2019


Ответы (4)


Использование транзакций в некоторой степени зависит от требований.

Очевидно, что использование транзакций в операциях UPDATE и DELETE имеет смысл. Использование транзакций в операторах SELECT также может быть полезным, если, например, вам нужно заблокировать запись, чтобы другой поток/запрос не изменил чтение. Как правило, это требование бизнеса.

В нашей компании мы заключаем все операторы (например, SELECT, UPDATE, DELETE) в транзакцию.

Кроме того, транзакционное управление действительно лучше подходит на другом уровне помимо уровня данных. Как правило, транзакции соответствуют бизнес-требованиям. Например, если требуется внести деньги на счет, то следует использовать какой-либо класс/код более высокого уровня, чтобы пометить весь метод как транзакционный, поскольку этот конкретный метод должен выполняться как единое целое (поскольку, вероятно, будет несколько баз данных). звонки).

Spring может многое сказать об управлении транзакциями.

person tjg184    schedule 13.05.2011
comment
Я также обычно оборачиваю каждую бизнес-операцию, которая обращается к базе данных, в транзакцию. Недавно мне было интересно, не вызывает ли это каких-либо накладных расходов, которые могут замедлить работу приложения. В таком случае имеет ли смысл использовать транзакцию только для создания, удаления, обновления? - person Giorgio; 04.03.2012
comment
Наша компания требует, чтобы мы фиксировали после каждой транзакции, даже после операторов SELECT. Я определенно мог видеть, где упаковка только операторов UPDATE создаст меньше накладных расходов. - person tjg184; 05.03.2012

Это кажется довольно приличным ответом на вопрос, почему вам следует. Однако это дает некоторые причины этого не делать. По сути, вы хотите использовать их, когда данные могут оказаться в плохом состоянии, если ваши изменения не будут завершены.

person John Kane    schedule 13.05.2011

Хорошим правилом является управление транзакциями на уровне приложения выше DAO. Таким образом, если у вас есть операция доступа к данным A, которую несколько раз необходимо выполнить в собственной транзакции, а иногда следует присоединиться к существующей транзакции, вам не придется прыгать через обручи. Объедините этот подход с управлением транзакциями (и сеансами Hibernate) через АОП и наблюдайте, как ваш код становится более понятным и удобным в сопровождении.

person Olaf    schedule 13.05.2011

Чтобы ответить на ваш конкретный вопрос о геттерах:

Если вы используете транзакцию AOP с readOnly true, и вы правильно установили свой диалект JPA в режим гибернации, Spring переведет ваш сеанс гибернации в режим без сброса. Это может привести к существенному повышению производительности при выполнении больших объемов операций за счет устранения ненужных грязных проверок. Так что стоит в этом плане.

person Affe    schedule 13.05.2011