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

Что такое транзакции?

транзакцию можно рассматривать как набор операций или как атомарную логическую единицу, которая может работать с несколькими источниками данных. Если транзакция завершилась неудачно, это означает, что какая-либо операция не была завершена по какой-либо причине, то все операции будут отменены.

Объем транзакции

Объем транзакции представлен в .Net 2.0 в пространстве имен System.Transaction. Это помогает нам легко обрабатывать транзакции, давая нам бесплатные полномочия писать код нашей базы данных и логический код в отдельных функциях или классах и вызывать их непосредственно в транзакциях. Вам не нужно добавлять несколько вложенных if else условий и делать код слишком длинным, иначе вы потеряете его читабельность и эффективность.

Как использовать объем транзакции?

Чтобы использовать область транзакции, вам необходимо использовать пространство имен add System.Transaction в своем классе.

Используя единый источник данных

try
{
    using (TransactionScope scope = new TransactionScope())
    {
       // 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 = new TransactionScope())
    {
       // Your first operation with SQL Connection String A
       using (connection = new SqlConnection(connectionStringA))
       {
           connection.Open();
           // Your first operation
           // Your second operation 
           // ...
       }
       // Your second operation with SQL Connection String B
       using (connection = new SqlConnection(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 #.