Junior
Šta je transakcija?
sobes.tech АИ
Одговор од АИ
Транзакција у контексту C# и база података/распоређених система је низ операција које се извршавају као целина (атомарна јединица рада). Или све операције у транзакцији успешно завршавају (фиксирају), или ниједна не извршава (отказује се).
Транзакције поседују својства ACID:
- Атомарност (Atomicity): Или све операције успешно извршавају, или ниједна.
- Сагласност (Consistency): Транзакција преноси систем из једног сагласног стања у друго.
- Изолација (Isolation): Паралелно извршавајуће се транзакције не утичу једна на другу.
- Поузданост (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();
// Искуствена грешка за демонстрацију отказа
// Користите реалан 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}");
}