Читаем Язык программирования C#9 и платформа .NET5 полностью

Транзакции также важны в ситуациях, когда операция базы данных включает в себя взаимодействие с множеством таблиц или хранимых процедур (либо с комбинацией атомарных элементов базы данных). Классическим примером транзакции может служить процесс перевода денежных средств с одного банковского счета на другой. Например, если вам понадобилось перевести $500 с депозитного счета на текущий чековый счет, то следующие шаги должны быть выполнены в транзакционной манере.

1. Банк должен снять $500 с вашего депозитного счета.

2. Банк должен добавить $500 на ваш текущий чековый счет.


Вряд ли бы вам понравилось, если бы деньги были сняты с депозитного счета, но не переведены (из-за какой-то ошибки со стороны банка) на текущий чековый счет, потому что вы попросту лишились бы $500. Однако если поместить указанные шаги внутрь транзакции базы данных, тогда СУБД гарантирует, что все взаимосвязанные шаги будут выполнены как единое целое. Если любая часть транзакции откажет, то будет произведен откат всей операции в исходное состояние. С другой стороны, если все шаги выполняются успешно, то транзакция будет зафиксирована.


На заметку! Из литературы, посвященной транзакциям, вам может быть известно сокращение АСЮ. Оно обозначает четыре ключевых характеристики транзакций: атомарность (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;

Перейти на страницу:

Похожие книги

Программирование. Принципы и практика использования C++ Исправленное издание
Программирование. Принципы и практика использования C++ Исправленное издание

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов

Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT
97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Нил Форд , Билл де Ора , Майкл Хайгард

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT