Транзакции в .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