Параметры .NET Transactionscope - PullRequest
       1

Параметры .NET Transactionscope

8 голосов
/ 28 февраля 2011

Я новичок в C #.Так что мне просто интересно, может ли кто-нибудь помочь мне понять, как C # работает с Transactionscope?Потому что я немного смущен определением этого.Однако позвольте мне немного рассказать о моей проблеме.Чтобы вы узнали, чего я пытаюсь достичь.

У меня есть три таблицы адаптеров, объявленных для трех разных наборов данных, например:

logTableAdapter logAdap = new logTableAdapter();
measTableAdapter measAdap = new measTableAdapter();
valueTableAdapter valueAdap = new valueTableAdapter();

Процесс импорта данных:

  1. Сначала я вставляю запись в журнал с помощью метода logAdap.insert ().
  2. Перебираю файл Excel, чтобы получить результаты измерений и начинает вставку с помощью метода measureAdap.insert ().
  3. Измерение по каждому элементу Я вставляю значения с помощью метода valueAdap.insert ().

Так что мой вопрос - поскольку измерение и значение имеют вложенную связь.Как я могу создать вложенную транзакцию, и когда где-нибудь происходит ошибка (вставка измерения / вставка значения), я просто хочу откатить все, что я сделал.То есть я просто хочу вернуться к точке до того, как я вставил запись в журнал.

Ответы [ 3 ]

3 голосов
/ 28 февраля 2011

Цитирование этой метко названной статьи: Окончательное сообщение в блоге TableAdapters + Transactions .

если вы работаете с множественными операциями внутри одного TransactionScope, то есть с «GetData» и «Update» внутри одного TransactionScope, или с двумя Update в TransactionScope, вы фактически откроете два SqlConnections для одной базы данных и, таким образом, излишне будете продвигать транзакция от LTM до MSDTC. В качестве наилучшей практики ВСЕГДА заключайте в TransactionScope только отдельную операцию. Если вы решите обернуть несколько операций внутри одного TransactionScope, в этом случае вы должны сами управлять временем жизни соединения, расширяя частичное определение класса. Другими словами, следующий код вызовет продвижение транзакции -

using (TransactionScope tsc = new TransactionScope())
{
    tableAdap.GetData() ;
    //Do your transactional work.
    tableAdap.Update() ;
    tsc.Complete() ;
}

Но следующий код просто отлично -

using (TransactionScope tsc = new TransactionScope())
{

    tableAdap.OpenConnection() ;
    tableAdap.GetData() ;

    //Do your transactional work.
    tableAdap.Update() ;
    tableAdap.CloseConnection() ;
    tsc.Complete() ;
} 

Так что вам нужен только один TransactionScope, но с некоторыми оговорками. Вот суть, но я призываю вас прочитать сообщение в блоге.

TableAdapters не самая подходящая методология доступа к данным для транзакционных систем с высокой степенью целостности. Если вам нужна большая надежность, вы, вероятно, должны написать свою операцию как хранимую процедуру и выполнить ее из своего кода C #.

0 голосов
/ 07 марта 2011

Поскольку я думаю, что вы искали способ использования TransactonScope, вот как будет выглядеть ваш код, немного изменив пример в вашем комментарии:

using( TransactionScope ts = new TransactionScope() ) { 
    try 
    { 
        logAdap.InsertLog(.....);

        foreach (.....)
        {
            measAdap.InsertMeas(.....); 
            foreach (.....)
            {
                valAdap.InsertVal(.....);
            }
        }

        // Complete the transaction
        ts.Complete();
    }
    catch (Exception ex) 
    { 
        // Your error handling here.
        // No need to rollback each table adapter. That along with all the 
        // transaction is done for you when exiting the using block without 
        // calling Complete() on the TransactionScope.
    }}

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

Сказав это, то, что упоминает fencliff, верно, поскольку вы, вероятно, не хотите открывать несколько соединений для своего сценария, экономя ценные ресурсы базы данных.

0 голосов
/ 28 февраля 2011

вам не нужно более одного TransactionScope, я думаю, вы можете делать все в одном и том же.

...