Junior
Mis on tehing?
sobes.tech AI
Vastus AI-lt
C# kontekstis andmebaaside/jaotatud süsteemide puhul on tehing (transaction) operatsioonide jada, mis täidetakse kui üks tervik (aatomaarne tööüksus). Kas kõik tehingu operatsioonid lõpevad edukalt (kinnituvad), või ei täideta ühtegi neist (tühistatakse).
Tehingutel on omadused ACID:
- Aatomilisus (Atomicity): Kas kõik operatsioonid täidetakse edukalt või mitte ükski.
- Järjepidevus (Consistency): Tehing viib süsteemi ühest järjepidevast olekust teise.
- Isoleeritus (Isolation): Paralleelselt täidetavad tehingud ei mõjuta üksteist.
- Kestvus (Durability): Edukalt lõpetatud tehingu tulemused säilivad isegi süsteemi rikke korral.
C#-s kasutatakse tehingutega töötamiseks sageli järgmisi klasse:
System.Data.Common.DbTransaction(põhiklass andmebaasi tehingutele)System.Transactions.TransactionScope(lihtsustab jaotatud tehingute haldamist)- Spetsiifilised ADO.NET pakkujate tehingu klassid (näiteks
System.Data.SqlClient.SqlTransaction)
Näide TransactionScope kasutamisest:
// `TransactionScope` kasutamine automaatseks tehingu haldamiseks
using System;
using System.Data.SqlClient;
using System.Transactions;
// Eeldame, et on olemas ühendus andmebaasiga
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();
// Kunstlik viga demonstratsiooniks
// Kasutage reaalset UPDATE/INSERT/DELETE
// using (var command2 = new SqlCommand("UPDATE Accounts SET Balance = Balance + 100 WHERE AccountId = 2", connection2))
// {
// command2.ExecuteNonQuery();
// }
throw new InvalidOperationException("Simuleeritud viga"); // Vea simulatsioon
}
// Kui kõik operatsioonid õnnestuvad, kutsume välja Complete()
scope.Complete();
Console.WriteLine("Tehing kinnitatud.");
}
}
catch (Exception ex)
{
// Kui tekib viga, TransactionScope automaatselt tühistab tehingu
Console.WriteLine($"Tehing tühistati. Viga: {ex.Message}");
}