Sobes.tech
Junior

რა არის ტრანზაქცია?

sobes.tech AI

პასუხი AI-სგან

C# և տվյալների բազաների/տարածված համակարգերի կոնտեքստում գործարք (transaction) նշանակում է գործողությունների հաջորդականություն, որը կատարվում է որպես միավոր (ատոմային աշխատանքային միավոր): Կամ բոլոր գործողությունները հաջողությամբ ավարտվում են (կամ հաստատվում), կամ ոչ մեկը չի կատարվում (վերադարձ է կատարվում):

Գործարքները ունեն ACID հատկություններ՝

  • Ատոմարություն (Atomicity): կամ բոլոր գործողությունները հաջողությամբ կատարվում են, կամ ոչ մեկը:
  • Կոնսիստենտություն (Consistency): Գործարքը համակարգը տեղափոխում է մեկ կոնսիստենտ վիճակից մյուսը:
  • Իզոլացիա (Isolation): Paralleլորեն կատարվող գործարքները չեն ազդում միմյանց վրա:
  • Տևականություն (Durability): Հաջող ավարտված գործարքի արդյունքները պահպանվում են համակարգի խափանումների դեպքում:

C#-ում գործարքների հետ աշխատելու համար հաճախ օգտագործվում են հետևյալ դասերը:

  • System.Data.Common.DbTransaction (հիմնական դասը տվյալների բազայի գործարքների համար)
  • System.Transactions.TransactionScope (պարզեցնում է տարածված գործարքների կառավարումը)
  • Տարբեր ADO.NET մատակարարների հատուկ դասեր (օրինակ, System.Data.SqlClient.SqlTransaction)

Օրինակ՝ TransactionScope-ի օգտագործումը:

// Օգտագործում է TransactionScope-ը ավտոմատ գործարքի կառավարում
using System;
using System.Data.SqlClient;
using System.Transactions;

// Կանխատեսվում է, որ կապը տվյալների բազայի հետ կա
string connectionString = "...";

try
{
    using (var scope = new TransactionScope())
    {
        using (var connection1 = new SqlConnection(connectionString))
        {
            connection1.Open();
            using (var command1 = new SqlCommand("UPDATE Accounts SET Balance = Balance - 100 WHERE AccountId = 1", connection1))
            {
                command1.ExecuteNonQuery();
            }
        }

        using (var connection2 = new SqlConnection(connectionString))
        {
            connection2.Open();
            // Արհեստական սխալ՝ ցուցադրական rollback-ի համար
            // Օգտագործեք իրական UPDATE/INSERT/DELETE
            // using (var command2 = new SqlCommand("UPDATE Accounts SET Balance = Balance + 100 WHERE AccountId = 2", connection2))
            // {
            //     command2.ExecuteNonQuery();
            // }
            throw new InvalidOperationException("Սիմուլացված սխալ"); // Նման սխալի իմիտացիա
        }

        // Եթե բոլոր գործողությունները հաջող ավարտվեն, կանչում ենք Complete()
        scope.Complete();
        Console.WriteLine("Գործարքը հաստատված:");
    }
}
catch (Exception ex)
{
    // Եթե սխալ է տեղի ունենում, TransactionScope-ը ավտոմատ կերպով վերացնում է գործարքը
    Console.WriteLine($"Գործարքը հետ է մղվել: Սխալ: {ex.Message}");
}