Транзакции в .net

Каковы лучшие практики выполнения транзакций 9X_.net в C# .Net 2.0. Какие классы следует использовать? Какие 9X_c# подводные камни следует искать и т. Д. Все, что 9X_.cs-file связано с фиксацией и откатом. Я только 9X_c#-language начинаю проект, в котором мне может потребоваться 9X_csharp выполнить некоторые транзакции при вставке 9X_csharp данных в БД. Приветствуются любые ответы 9X_transaction или ссылки даже на базовые сведения о транзакциях.

152
1

  • Полезно http://www.codeproject.com ...
4
Общее количество ответов: 4

Ответ #1

Ответ на вопрос: Транзакции в .net

Есть 2 основных типа транзакций; транзакции 9X_c# подключения и внешние транзакции. Транзакция 9X_transactional подключения (например, SqlTransaction) привязана 9X_transactions непосредственно к соединению с базой данных 9X_transactional (например, SqlConnection), что означает, что 9X_c#-language вы должны продолжать передавать соединение 9X_transactions - в некоторых случаях ОК, но не позволяет 9X_transactions «создавать / использовать / выпускать» использование 9X_.net и не позволяет работать с кросс-базами данных. Пример 9X_c-sharp (с форматированием для пробела):

using (IDbTransaction tran = conn.BeginTransaction()) {
    try {
        // your code
        tran.Commit();
    }  catch {
        tran.Rollback();
        throw;
    }
}

Не слишком 9X_transaction беспорядочно, но ограничивается нашим соединением 9X_csharp "conn". Если мы хотим вызвать 9X_c-sharp разные методы, теперь нам нужно передать 9X_transaction «conn».

Альтернативой является внешняя транзакция; новый 9X_csharp в .NET 2.0 объект TransactionScope (System.Transactions.dll) позволяет 9X_.net использовать в диапазоне операций (подходящие 9X_transactions поставщики автоматически подключаются к 9X_c-sharp внешней транзакции). Это позволяет легко 9X_dot-net встраиваться в существующий (не транзакционный) код 9X_.net-framework и общаться с несколькими поставщиками (хотя 9X_csharp DTC будет участвовать, если вы поговорите 9X_transactional с более чем одним).

Например:

using(TransactionScope tran = new TransactionScope()) {
    CallAMethodThatDoesSomeWork();
    CallAMethodThatDoesSomeMoreWork();
    tran.Complete();
}

Обратите внимание, что 9X_dotnet два метода могут обрабатывать свои собственные 9X_c#.net соединения (open / use / close / dispose), но 9X_.cs-file они незаметно станут частью внешней транзакции 9X_.cs-file без необходимости передавать что-либо.

Если 9X_csharp в вашем коде есть ошибки, Dispose() будет 9X_dotnet вызываться без Complete(), поэтому будет 9X_c#-language выполнен откат. Поддерживается ожидаемое 9X_csharp вложение и т. Д., Хотя вы не можете откатить 9X_.cs-file внутреннюю транзакцию, но завершить внешнюю 9X_c-sharp транзакцию: если кто-то недоволен, транзакция 9X_.net прерывается.

Другое преимущество TransactionScope 9X_dot-net заключается в том, что он не привязан только 9X_c#-language к базам данных; его может использовать любой 9X_c#-language провайдер, поддерживающий транзакции. WCF, например. Или 9X_c#.net есть даже некоторые объектные модели, совместимые 9X_c#.net с TransactionScope (например, классы .NET 9X_dot-net с возможностью отката - возможно, проще, чем 9X_c#.net сувенир, хотя сам я никогда не использовал 9X_visual-c# этот подход).

В общем, очень и очень полезный 9X_c#-language предмет.

Некоторые предостережения:

  • В SQL Server 2000 TransactionScope немедленно перейдет в DTC; это исправлено в SQL Server 2005 и более поздних версиях, он может использовать LTM (намного меньше накладных расходов), пока вы не поговорите с двумя источниками и т. д., когда он будет повышен до DTC.
  • Существует glitch, который означает, что вам может потребоваться настроить строку подключения.

279
2

  • @Eduardo - это не проблема при использовании Transaction ...

Ответ #2

Ответ на вопрос: Транзакции в .net

protected void Button1_Click(object sender, EventArgs e)
   {


       using (SqlConnection connection1 = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\Database.mdf;Integrated Security=True;User Instance=True"))
       {
           connection1.Open();

           // Start a local transaction.
           SqlTransaction sqlTran = connection1.BeginTransaction();

           // Enlist a command in the current transaction.
           SqlCommand command = connection1.CreateCommand();
           command.Transaction = sqlTran;

           try
           {
               // Execute two separate commands.
               command.CommandText =
                "insert into [doctor](drname,drspecialization,drday) values ('a','b','c')";
               command.ExecuteNonQuery();
               command.CommandText =
                "insert into [doctor](drname,drspecialization,drday) values ('x','y','z')";
               command.ExecuteNonQuery();

               // Commit the transaction.
               sqlTran.Commit();
               Label3.Text = "Both records were written to database.";
           }
           catch (Exception ex)
           {
               // Handle the exception if the transaction fails to commit.
               Label4.Text = ex.Message;


               try
               {
                   // Attempt to roll back the transaction.
                   sqlTran.Rollback();
               }
               catch (Exception exRollback)
               {
                   // Throws an InvalidOperationException if the connection 
                   // is closed or the transaction has already been rolled 
                   // back on the server.
                   Label5.Text = exRollback.Message;

               }
           }
       }


   }

9X_transactions

12
0

Ответ #3

Ответ на вопрос: Транзакции в .net

Вы также можете заключить транзакцию в ее 9X_.net собственную хранимую процедуру и обрабатывать 9X_visual-c# ее таким образом вместо того, чтобы выполнять 9X_c#.net транзакции в самом C#.

4
0

Ответ #4

Ответ на вопрос: Транзакции в .net

Если он вам нужен только для работы с базами 9X_c#-language данных, некоторые OR Mappers (например, NHibernate) по 9X_dot-net умолчанию поддерживают транзакции прямо 9X_c#.net из коробки.

1
0