2010-09-23 3 views
0

У меня проблемы с TransactionPropagation.NotSupported. Я полагал, что это распространение приводит к тому, что код выполняется без транзакции. Означает, что, когда я помечен конкретным методом, текущая транзакция будет приостановлена, и код будет выполнен без какой-либо транзакции.Spring.net TransactionPropagation NotSupported

Текущая версия spring.net вместо этого создает новую транзакцию. Смотрите следующий код:

[Test] 
public void A() { 
     TransactionTemplate template = new TransactionTemplate(TransactionManager) { 
      PropagationBehavior = TransactionPropagation.NotSupported 
     }; 
     template.Execute(delegate { 
      Assert.AreEqual(0, 
       SessionFactory.GetCurrentSession().Linq<XXX>(). 
       Where(t => t.Id.Equals(YYY)).ToList().Count); 
      return null; 
     }); 
} 

Я надеялся, что эта запись вызывает то, что LINQ запрос выполняется без транзакции, и он будет бросать новое исключение. Но журнал показал, что он автоматически создает как новый сеанс, так и транзакцию.

Я выяснил эту проблему, когда отмечен какой-либо метод упомянутой аннотацией, и, несмотря на аннотацию, запрос LINQ внутри был правильно выполнен.

Вопрос в следующем: как я могу пометить метод, чтобы он не использовал транзакцию вообще? Я не хочу использовать распространение никогда, поскольку я хочу, чтобы текущая транзакция была приостановлена.

В моем проекте есть поток бизнес-кода, есть обработка транзакций, и я хочу отметить любые части, которые, безусловно, не являются транзакционными.

ответ

1

Вы упомянули, что можете сообщить из журнала, что начинается новая транзакция. Какой журнал, база данных или приложение? Какую базу данных вы используете? Некоторые базы данных не позволит вам выполнить запрос за пределами сделки вообще, так что бы просто начать один внутренний для вас ...


Update:

Ваши вопросы похож на этот:

https://jira.springframework.org/browse/SPRNET-1307?page=com.atlassian.jira.plugin.ext.bamboo%3Abamboo-build-results-tabpanel#issue-tabs

Я бы убедиться, что вы работаете версию Spring.NET, которая имеет исправления в нем (выглядит как V 1.3.1 или выше?)

Кроме того, вы можете попытаться вручную подавить транзакцию и посмотреть, не исправляет ли это поведение:

using(var tx = new TransactionScope(TransactionScopeOption.Suppress)) 
{ 
    // make DB call... 
} 
+0

Журнал Log4net, созданный по моему тесту. NHibernate регистрирует некоторые полезные сведения в области режима DEBUG. Я использую MSSQL. –

+0

Спасибо. Я уже нашел эту проблему, но я не знал, как определить или использовать TransactionScopeOption.Suppress с использованием транзакции spring.net и nhibernate. Я не знаю, куда его вводить, я использую вчерашнюю сборку Spring.net, поэтому Spring.net содержит исправленное поведение. –

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