2015-04-21 3 views
0

Я ссылаюсь на пример, указанный в URL-адресе, который должен применять транзакцию Spring aop во всех методах в слоях услуг, но это также применит управление транзакциями для методов только для чтения, таких как SELECT.Управление транзакциями Spring AOP для уровня обслуживания

Есть ли отрицательный эффект, если я применяю управление транзакциями для транзакции readOnly?

<aop:config> 
<aop:advisor pointcut="execution(* com.xyz.someapp.service.*.*(..)))" 
advice-ref="transactionAdvice" /> 
</aop:config> 

http://www.studytrails.com/frameworks/spring/spring-declarative-transactions.jsp

У меня есть еще один вопрос. Если у меня есть orderService.create(), который вызывает billingService.create(), как будет применяться изоляция транзакции?

ответ

1

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

1

Я не думаю, что будут какие-либо неблагоприятные последствия, потому что транзакция просто определяет атомный набор операций. Если транзакция завершится с ошибкой, будет выполнен откат, но операции только для чтения никак не влияют на базу данных. Единственный большой недостаток, о котором я могу думать, связан с производительностью. Стратегия блокировки базовой базы данных (независимо от того, заблокирована ли таблица или строка) определяет уровень изоляции. В соответствии с вашей стратегией блокировки во время транзакции применяется какая-то изоляция. Например, когда вы пишете базу данных, ваш уровень изоляции решает, можно ли увидеть изменения в ходе параллельных чтений (в результате чего появляются грязные чтения, неповторяющиеся чтения и т. Д.) Или если эти изменения должны быть выполнены до того, как они становятся видимыми для других. Как следствие, вы заблокировали ресурсы, которые вы только хотите прочитать, что может привести к переполнению производительности в высокодоступных приложениях. Подводя итог: это не имеет плохих последствий, кроме проблем с производительностью.

Решение второго вопроса: это зависит от того, как вы управляете транзакциями. Думаю, в этом случае оба метода службы требуют транзакций, поэтому я считаю, что поведение по умолчанию заключается в том, что транзакция первого вызова службы наследуется вторым вызовом метода службы (это называется «распространение транзакции»). Это необходимо, поскольку вложенные транзакции не разрешены.

Смежные вопросы