Язык программирования C#9 и платформа .NET5
Часть 401 из 642 Информация о книге
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()и добавит к фамилии метку "(Credit Risk)".CreditRiskspublic 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();// Создать объекты команды, представляющие каждый шаг операции.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,