При работе с SQL / ADO, получил меня думающий о чем-то, что я думаю, должен логически быть включен с платформой .NET, и я задавался вопросом, существует ли такая вещь, позвольте мне объяснить.
Есть ли объект, который является по существу менеджером транзакций, к которому Вы передаете команды (объекты работы), и в том же я предположил бы, что это будет необходимо, также передают действия отката для каждого объекта работы в транзакции.
Например,
Позволяет говорят, что я хотел выполнить следующие действия:
Теперь в настоящее время, если что-то перестало работать, я должен вручную реализовать список назад стратегия, поэтому возможно, путь существует для управления этими объектами работы как транзакцией с помощью oob функциональность .NET?
Мои соображения состоят в том, что это попросило бы, чтобы много имело откат объектов автоматически, но имело бы способность вручную управлять тем, что происходит во время отката на объект работы, кажется практичным.
Другая вещь - то, что Microsoft сделали с LINQ, является действительно большим, эффективно имея SQL как запросы для всех видов материала, не только для таблиц SQL. Таким образом, возможно, существует некоторая модель транзакции с LINQ?
Спасибо, если Вы знаете о чем-нибудь как это?
Вы можете использовать класс TransactionScope, чтобы начать транзакцию, но любые действия, которые вы предпринимаете внутри этой транзакции, должны быть "осведомлены о транзакции" и знать, как компенсировать, если транзакция будет откатана.
Брент ВандерМейде сделал серию из двух частей на dnrTV о том, как писать классы, которые знают о TransactionScope. Вот часть 1, а вот часть 2.
Обычно транзакции в этом смысле подразумевают DB IO, а не операции с файловой системой. В ADO.Net 2.0 вы должны сделать что-то вроде приведенного ниже кода.
Для других типов транзакций я бы посоветовал изучить MS DTC (координатор распределенных транзакций). Это позволит вашим транзакциям охватить разные машины, и я также считаю, что это позволяет вам включать настраиваемые действия для отката.
Надеюсь, это поможет.
using (SqlConnection connection =
new SqlConnection(connectionString))
{
SqlCommand command = connection.CreateCommand();
SqlTransaction transaction = null;
try
{
// BeginTransaction() Requires Open Connection
connection.Open();
transaction = connection.BeginTransaction();
// Assign Transaction to Command
command.Transaction = transaction;
// Execute 1st Command
command.CommandText = "Insert ...";
command.ExecuteNonQuery();
// Execute 2nd Command
command.CommandText = "Update...";
command.ExecuteNonQuery();
transaction.Commit();
}
catch
{
transaction.Rollback();
throw;
}
finally
{
connection.Close();
}
}