Junior
164
questionbank
Что такое транзакция?
Ответ от нейросети
sobes.tech AI
Транзакция в контексте C# и баз данных/распределенных систем — это последовательность операций, выполняемая как единое целое (атомарная единица работы). Либо все операции в транзакции успешно завершаются (фиксируются), либо ни одна не выполняется (откатывается).
Транзакции обладают свойствами ACID:
- Атомарность (Atomicity): Либо все операции выполняются успешно, либо ни одна.
- Согласованность (Consistency): Транзакция переводит систему из одного согласованного состояния в другое.
- Изолированность (Isolation): Параллельно выполняющиеся транзакции не влияют друг на друга.
- Надежность (Durability): Результаты успешно завершенной транзакции сохраняются даже при сбоях системы.
В C# для работы с транзакциями часто используются такие классы:
System.Data.Common.DbTransaction(базовый класс для транзакций БД)System.Transactions.TransactionScope(упрощает управление распределенными транзакциями)- Specific ADO.NET provider transaction classes (например,
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("Simulating an error"); // Имитация ошибки
}
// Если все операции прошли успешно, вызываем Complete
scope.Complete();
Console.WriteLine("Transaction committed.");
}
}
catch (Exception ex)
{
// Если произошла ошибка, TransactionScope автоматически откатывает транзакцию
Console.WriteLine($"Transaction rolled back. Error: {ex.Message}");
}