Junior
Какво е транзакция?
sobes.tech AI
Отговор от AI
Транзакцията в контекста на 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}");
}