2010-08-13 5 views
2

У меня есть сервер приложений N-уровня C# ASP .Net, который использует хранимые процедуры для связи с базой данных.Изолированное совершение транзакции в SQL

У меня есть служебный уровень, который откатывает все транзакции ADO .net, если выбрано исключение, используя TransactionScope.requiresNew.

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

Как это сделать?

Я попытался использовать новый TransactionScope.RequiresNew в нашем слое данных, но это не имеет никакого эффекта.

ответ

0

Странный - требуется новый во внутреннем (протоколировании) TransactionScope должен работать.

В нижележащей транзакции TransactionScopeOption.Suppress или TransactionScopeOption.RequiresНовые работают для меня - внутренняя транзакция зафиксирована (Dal2.x), а внешняя отменена (Dal1.x).

try 
    { 
     using (TransactionScope tsOuter = new TransactionScope(TransactionScopeOption.Required)) 
     { 
      DAL1.Txn1(); 
      using (TransactionScope tsLogging = new TransactionScope(TransactionScopeOption.Suppress)) 
      { 
       DAL2.Txn2(); 
       tsLogging.Complete(); 
      } 
      throw new Exception("Big Hairy Exception"); 
     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 

Edit: Смешивание TransactionScope и явные транзакции T-SQL следует избегать - это указано в той же ссылке вы ссылаетесь именно http://msdn.microsoft.com/en-us/library/ms973865.aspx, цитируемым ниже

TransactionScopes управления транзакциями эскалации вполне разумно - они (например, DTC будет использоваться, только если транзакции охватывают несколько баз данных или ресурсов - например, SQL и MSMQ). Они также работают с транзакциями SQL 2005+ Lightweight, поэтому несколько соединений с одной и той же базой данных также будут управляться в транзакции без накладных расходов на DTC.

IMHO решение о том, следует ли использовать Suppress vs RequiresNew, зависит от того, нужно ли вообще выполнять аудит внутри транзакции - RequiresNew для изолированного txn, vs Suppress for none.

При использовании System.Transactions, приложение непосредственно не должны использовать транзакционное программированиюСистемное программирование интерфейсов ресурсных менеджеров-за например, T-SQL BEGIN TRANSACTION или глаголов TRANSACTION COMMIT, или MessageQueueTransaction() объект System.Messaging пространство имен, когда , касающийся MSMQ. Эти механизмы обойдут распределенное управление транзакций обрабатываются System.Transactions и комбинируя использование System.Transactions с этим менеджером ресурсов «внутренним» сделки приведет к противоречивым результатам .... Никогда не смешивать два

+0

Hi @nonnb, спасибо за это. Что я подавляю? – Russell

+0

После небольшого чтения (http://msdn.microsoft.com/en-us/library/ms973865.aspx) у Suppress нет транзакции вообще. Он также не использует внешнюю транзакцию, которую я хочу. Не уверен, предпочитаю ли я сделку или нет. У меня есть одна в моей хранимой процедуре (BEGIN TRANSACTION, COMMIT) ... – Russell

+0

Привет, Рассел. Я редактировал свое оригинальное сообщение, так как мой комментарий был слишком большим. Если сможешь. Поскольку похоже, что у вас есть стратегия управления транзакциями из вашего .NET-кода (например, Service или Business Tiers), вы бы рекомендовали отказаться от BEGIN TRAN/COMMIT TRAN от ваших sprocs. TransactionScope отменяет это. – StuartLC

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