Назад к вопросам
Junior
115
questionbank

Что такое транзакции в контексте баз данных и как они работают?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Транзакция - это последовательность операций с базой данных, которая рассматривается как единое целое. Либо все операции выполняются успешно (коммит), либо ни одна из них не применяется (откат). Это обеспечивает целостность данных.

Транзакции обладают свойствами ACID:

  • Атомарность (Atomicity): Вся транзакция либо выполняется полностью, либо не выполняется совсем.
  • Согласованность (Consistency): Каждая успешная транзакция изменяет базу данных из одного непротиворечивого состояния в другое.
  • Изолированность (Isolation): Результаты параллельно выполняющихся транзакций не влияют друг на друга.
  • Долговечность (Durability): Изменения, сделанные успешной транзакцией, сохраняются даже в случае сбоя системы.

Работают транзакции следующим образом:

  1. Начало транзакции (BEGIN/START TRANSACTION): База данных начинает записывать все последующие изменения, но не применяет их сразу к постоянному хранилищу.
  2. Выполнение операций: Выполняются SQL-запросы (INSERT, UPDATE, DELETE).
  3. Фиксация транзакции (COMMIT): Все изменения, внесенные в рамках транзакции, применяются к базе данных окончательно и становятся видимыми дляT других транзакций (с учетом уровня изоляции).
  4. Откат транзакции (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();
}
?>