Когда использовать транзакции в Spring с Hibernate? - PullRequest
5 голосов
/ 13 мая 2011

Обновление моего проекта. Я думаю о транзакциях.
Ну, дело в том, что я не совсем уверен , когда мне следует использовать транзакции для моих запросов Hibernate весной.
Не то чтобы я не совсем понимаю, что это за транзакции, наверное, но
Нужно ли использовать транзакции для запросов типа 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 и таких запросов.
Я что-то здесь упускаю?

Ответы [ 4 ]

6 голосов
/ 13 мая 2011

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

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

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

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

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

1 голос
/ 13 мая 2011

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

1 голос
/ 13 мая 2011

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

0 голосов
/ 13 мая 2011

Чтобы ответить на конкретный вопрос о получателях:

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

...