Вы знакомы с транзакциями? Вы когда-нибудь использовали транзакции в C #?
Нам часто нужны транзакции, когда нам нужно выполнять операции CRUD с несколькими таблицами в тех же или даже в разных источниках данных.

Что такое транзакции?
транзакцию можно рассматривать как набор операций или как атомарную логическую единицу, которая может работать с несколькими источниками данных. Если транзакция завершилась неудачно, это означает, что какая-либо операция не была завершена по какой-либо причине, то все операции будут отменены.
Объем транзакции
Объем транзакции представлен в .Net 2.0 в пространстве имен System.Transaction. Это помогает нам легко обрабатывать транзакции, давая нам бесплатные полномочия писать код нашей базы данных и логический код в отдельных функциях или классах и вызывать их непосредственно в транзакциях. Вам не нужно добавлять несколько вложенных if else условий и делать код слишком длинным, иначе вы потеряете его читабельность и эффективность.
Как использовать объем транзакции?
Чтобы использовать область транзакции, вам необходимо использовать пространство имен add System.Transaction в своем классе.
Используя единый источник данных
try { using(TransactionScope scope = newTransactionScope()) { // Your first operation with SQL Connection String // Your second operation // ...// if success so far, commit the transaction scope.Complete(); } } catch (Exception ex) { // transaction will be rolled back if exception occurs // ... }
scope.Complete()указывает, что все операции в рамках области завершены без сбоев.
Используя несколько источников данных
try { using(TransactionScope scope = newTransactionScope()) { // Your first operation with SQL Connection String A using(connection = newSqlConnection(connectionStringA)) { connection.Open(); // Your first operation // Your second operation // ... }// Your second operation with SQL Connection String B using(connection = newSqlConnection(connectionStringB)) { connection.Open(); // Your first operation // Your second operation // ... }// ...// if success so far, commit the transaction scope.Complete(); } } catch (Exception ex) { // transaction will be rolled back if exception occurs // ... }
Когда все операции выполнены успешно, вы должны сообщить диспетчеру транзакций о фиксации транзакции, вызвав метод Complete. Если вы не вызовете этот метод, ваша транзакция будет прервана.
Использование одноразового блока
Я использовал блок Disposable при создании экземпляра класса TransactionScope, так как он обеспечивает вызов метода dispose, когда он выходит из блока и завершает область транзакции.
Помните, что если вы не используете Disposing Block, вам необходимо вызвать метод Dispose после вызова метода Complete для Объем транзакции.
Я лично обнаружил, что в одном из бизнес-процессов регистрации пользователей это очень просто. От регистрации до проверки пользователей, от добавления участника до деактивации участников ... Я использовал эту замечательную библиотеку, чтобы мой код оставался простым и управляемым, и рекомендую своим коллегам использовать ее при необходимости.
Обязательно ознакомьтесь с моим рассказом о Стандартах кодирования на C #.