#c# #nhibernate #transactions #aop #spring.net
#c# #nhibernate #транзакции #aop #spring.net
Вопрос:
У меня есть следующее объявление:
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
Я перенес все методы транзакций из шаблонов pointcut.
Но я хочу, чтобы пользовательская оболочка одного из методов.
Имеет ли Spring.Чистая функциональность «черного списка» для tx: рекомендации?
Ответ №1:
Я не думаю, что в <tx:advice ... />
теге есть функция «черный список». Рекомендация по транзакции всегда будет применяться к соответствующим методам.
Я думаю, что цель <tx:attributes ... />
списка — указать, какие атрибуты транзакции использовать (в зависимости от имени метода), чтобы не исключать включение методов в транзакцию.
Если вы заинтересованы только в применении пользовательских свойств транзакции к определенному методу, это можно легко сделать. Например, если вы хотите установить read-only=true
вместо значения по умолчанию false
для VerySpecificMethod
:
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="VerySpecificMethod" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
Первое совпадающее имя метода укажет атрибуты транзакции, которые нужно использовать so now, VerySpecificMethod
которые будут выполняться в транзакции, доступной только для чтения. Другие методы будут использовать значение по умолчанию false
.
Комментарии:
1. Спасибо, я пробую это после праздников.
2. Я хочу вызвать методы Save и Get из одного метода, но эти методы обернуты одной транзакцией через AOP. Вызов Get вызывает исключения, потому что не было фиксации транзакции.
3. Затем вы должны использовать атрибут распространения. Что-то вроде
<tx:method name="VerySpecificMethod" propagation="RequiresNew"/>
. Проверьте в документах доступные атрибуты распространения .4. По умолчанию будет использоваться та же транзакция. При сохранении вы, конечно, не должны использовать
read-only="true"
настройку атрибута.5. Не могли бы вы попробовать
<tx:method name="NameOfWrappingMethod" propagation="Never"/>
?