Назад к вопросам
Junior
115
questionbank
Что такое транзакции в контексте баз данных и как они работают?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Транзакция - это последовательность операций с базой данных, которая рассматривается как единое целое. Либо все операции выполняются успешно (коммит), либо ни одна из них не применяется (откат). Это обеспечивает целостность данных.
Транзакции обладают свойствами ACID:
- Атомарность (Atomicity): Вся транзакция либо выполняется полностью, либо не выполняется совсем.
- Согласованность (Consistency): Каждая успешная транзакция изменяет базу данных из одного непротиворечивого состояния в другое.
- Изолированность (Isolation): Результаты параллельно выполняющихся транзакций не влияют друг на друга.
- Долговечность (Durability): Изменения, сделанные успешной транзакцией, сохраняются даже в случае сбоя системы.
Работают транзакции следующим образом:
- Начало транзакции (BEGIN/START TRANSACTION): База данных начинает записывать все последующие изменения, но не применяет их сразу к постоянному хранилищу.
- Выполнение операций: Выполняются SQL-запросы (INSERT, UPDATE, DELETE).
- Фиксация транзакции (COMMIT): Все изменения, внесенные в рамках транзакции, применяются к базе данных окончательно и становятся видимыми дляT других транзакций (с учетом уровня изоляции).
- Откат транзакции (ROLLBACK): В случае ошибки или необходимости отмены, все изменения, сделанные с начала транзакции, отменяются. База данных возвращается в состояние, предшествующее началу транзакции.
Пример использования в PHP с PDO:
<?php
// Подключение к базе данных
$dbh = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
try {
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Включаем исключения при ошибках
$dbh->beginTransaction(); // Начало транзакции
// Операции внутри транзакции
$stmt1 = $dbh->prepare("INSERT INTO accounts (name, balance) VALUES (?, ?)");
$stmt1->execute(['Alice', 1000]);
$stmt2 = $dbh->prepare("UPDATE accounts SET balance = balance - ? WHERE name = ?");
$stmt2->execute([100, 'Alice']);
$stmt3 = $dbh->prepare("UPDATE accounts SET balance = balance + ? WHERE name = ?");
$stmt3->execute([100, 'Bob']);
$dbh->commit(); // Фиксация транзакции, если все прошло успешно
echo "Транзакция успешно завершена.";
} catch (Exception $e) {
$dbh->rollBack(); // Откат транзакции в случае ошибки
echo "Ошибка транзакции: " . $e->getMessage();
}
?>