// Создать объекты команды, представляющие каждый шаг операции.
var cmdUpdate = new SqlCommand(
"Update Customers set LastName = LastName + ' (CreditRisk) '
where Id = @customerId",
_sqlConnection); cmdUpdate.Parameters.Add(paramId);
var cmdInsert = new SqlCommand(
"Insert Into CreditRisks (CustomerId,FirstName, LastName)
Values( @CustomerId, @
FirstName, @LastName)", _sqlConnection); SqlParameter parameterId2 = new SqlParameter
{
ParameterName = "@CustomerId",
SqlDbType = SqlDbType.Int,
Value = customerId,
Direction = ParameterDirection.Input
};
SqlParameter parameterFirstName = new SqlParameter
{
ParameterName = "@FirstName",
Value = fName,
SqlDbType = SqlDbType.NVarChar,
Size = 50,
Direction = ParameterDirection.Input
};
SqlParameter parameterLastName = new SqlParameter
{
ParameterName = "@LastName",
Value = lName,
SqlDbType = SqlDbType.NVarChar,
Size = 50,
Direction = ParameterDirection.Input
};
cmdInsert.Parameters.Add(parameterId2);
cmdInsert.Parameters.Add(parameterFirstName);
cmdInsert.Parameters.Add(parameterLastName);
// Это будет получено из объекта подключения.
SqlTransaction tx = null;
try
{
tx = _sqlConnection.BeginTransaction();
// Включить команды в транзакцию.
cmdInsert.Transaction = tx;
cmdUpdate.Transaction = tx;
// Выполнить команды.
cmdInsert.ExecuteNonQuery();
cmdUpdate.ExecuteNonQuery();
// Эмулировать ошибку.
if (throwEx)
{
throw new Exception("Sorry! Database error! Tx failed...");
// Возникла ошибка, связанная с базой данных! Отказ транзакции...
}
// Зафиксировать транзакцию!
tx.Commit();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
// Любая ошибка приведет к откату транзакции.
// Использовать условную операцию для проверки на предмет null.
tx?.Rollback();
}
finally
{
CloseConnection();
}
}
Здесь используется входной параметр типа bool
Обратите внимание на применение двух объектов SqlCommand
customerID с помощью метода BeginTransaction() объекта подключения можно получить допустимый объект SqlTransaction. Затем (что очень важно) потребуется Transaction полученного объекта транзакции. Если этого не сделать, то логика вставки и обновления не будет находиться в транзакционном контексте.После вызова метода ExecuteNonQuery()
bool равно true. В таком случае происходит откат всех ожидающих операций базы данных. Если исключение не было сгенерировано, тогда в результате вызова Commit() оба шага будут зафиксированы в таблицах базы данных.Тестирование транзакции базы данных