На заметку!
Из литературы, посвященной транзакциям, вам может быть известно сокращение АСЮ. Оно обозначает четыре ключевых характеристики транзакций: атомарность (atomic; все или ничего), согласованность (consistent; данные остаются устойчивыми на протяжении транзакции), изоляция (isolated; транзакции не влияют друг на друга) и постоянство (durable; транзакции сохраняются и протоколируются в журнале).В свою очередь платформа .NET Core поддерживает транзакции различными способами. Здесь мы рассмотрим объект транзакции поставщика данных ADO.NET (SqlTransaction
Microsoft.Data.SqlClient).В дополнение к готовой поддержке транзакций внутри библиотек базовых классов .NET Core можно также использовать язык SQL имеющейся СУБД. Например, вы могли бы написать хранимую процедуру, в которой применяются операторы BEGIN TRANSACTION
ROLLBACK и COMMIT.Основные члены объекта транзакции ADO.NET
Все транзакции, которые будут использоваться, реализуют интерфейс IDbTransaction
IDbTransaction определяет несколько членов:public interface IDbTransaction : IDisposable
{
IDbConnection Connection { get; }
IsolationLevel IsolationLevel { get; }
void Commit();
void Rollback();
}
Обратите внимание на свойство Connection
Commit() вызывается, если все операции в базе данных завершились успешно, что приводит к сохранению в хранилище данных всех ожидающих изменений. И наоборот, метод Rollback() можно вызвать в случае генерации исключения времени выполнения, что информирует СУБД о необходимости проигнорировать все ожидающие изменения и оставить первоначальные данные незатронутыми.На заметку!
СвойствоIsolationLevel объекта транзакции позволяет указать, насколько активно транзакция должна защищаться от действий со стороны других параллельно выполняющихся транзакций. По умолчанию транзакции полностью изолируются вплоть до их фиксации.Помимо членов, определенных в интерфейсе IDbTransaction
SqlTransaction определяет дополнительный член под названием Save(), который предназначен для определения Save() с использованием объекта SqlTransaction можно задавать удобный строковый псевдоним, а при вызове Rollback() этот псевдоним можно указывать в качестве аргумента для выполнения Rollback() без аргументов приводит к отмене всех ожидающих изменений.Добавление метода транзакции в inventoryDal
Давайте посмотрим, как работать с транзакциями ADO.NET программным образом. Начните с открытия созданного ранее проекта библиотеки кода AutoLot.Dal
InventoryDal новый открытый метод по имени ProcessCreditRisk(), предназначенный для работы с кредитными рисками. Метод будет искать клиента, в случае нахождения поместит его в таблицу CreditRisks и добавит к фамилии метку "(Credit Risk)".public void ProcessCreditRisk(bool throwEx, int customerId)
{
OpenConnection();
// Найти имя текущего клиента по идентификатору.
string fName;
string lName;
var cmdSelect = new SqlCommand(
"Select * from Customers where Id = @customerId",
_sqlConnection);
SqlParameter paramId = new SqlParameter
{
ParameterName = "@customerId",
SqlDbType = SqlDbType.Int,
Value = customerId,
Direction = ParameterDirection.Input
};
cmdSelect.Parameters.Add(paramId);
using (var dataReader = cmdSelect.ExecuteReader())
{
if (dataReader.HasRows)
{
dataReader.Read();
fName = (string) dataReader["FirstName"];
lName = (string) dataReader["LastName"];
}
else
{
CloseConnection();
return;
}
}
cmdSelect.Parameters.Clear();