Как исключить метод из рекомендации по транзакции?

#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"/> ?