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}");
}