Какие SQL-операторы или методы используются для работы с транзакциями?

Ответ

Для управления транзакциями в SQL и при работе с базами данных из PHP используются следующие ключевые операторы и методы:

1. SQL-операторы:

  • BEGIN или START TRANSACTION — начинает новую транзакцию.
  • COMMIT — фиксирует все изменения, сделанные в текущей транзакции.
  • ROLLBACK — отменяет все изменения текущей транзакции.
  • SAVEPOINT identifier — создает точку сохранения внутри транзакции, к которой можно откатиться.
  • ROLLBACK TO SAVEPOINT identifier — откатывает транзакцию к указанной точке сохранения.

2. Методы в PHP (PDO):

$pdo = new PDO($dsn, $user, $pass);

$pdo->beginTransaction(); // Начало транзакции
try {
    // Выполняем несколько запросов
    $stmt1 = $pdo->prepare("UPDATE accounts SET balance = balance - ? WHERE id = ?");
    $stmt1->execute([100.00, 1]);

    $stmt2 = $pdo->prepare("UPDATE accounts SET balance = balance + ? WHERE id = ?");
    $stmt2->execute([100.00, 2]);

    $pdo->commit(); // Фиксация, если все успешно
    echo "Транзакция завершена.";
} catch (Exception $e) {
    $pdo->rollBack(); // Откат при любой ошибке
    echo "Транзакция откачена: " . $e->getMessage();
}

3. Методы в PHP (MySQLi):

$mysqli->begin_transaction(); // или $mysqli->autocommit(FALSE);
try {
    $mysqli->query("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
    $mysqli->query("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
    $mysqli->commit();
} catch (Exception $e) {
    $mysqli->rollback();
}

Транзакции обеспечивают ACID-свойства, главное из которых — атомарность: либо выполняются все операции в блоке, либо ни одна.

Ответ 18+ 🔞

Э, слушай, смотри, сейчас объясню про эти ваши транзакции, чтобы ты не наебнулся с базой, как последний распиздяй. Представь, что ты переводишь бабки с карты на карту. Ты же не хочешь, чтобы с одной списались, а на другую не пришли, верно? Вот для этого и нужны транзакции, чтобы либо всё прошло, либо нихуя.

1. SQL-команды, которые рулят этим цирком:

  • BEGIN или START TRANSACTION — это как крикнуть «Погнали!». Начинается блок операций, которые должны быть неразрывными.
  • COMMIT — «Всё, зафиксировали!». Все изменения, которые ты наделал с момента BEGIN, теперь навсегда в базе. Точка.
  • ROLLBACK — «Отмена, я передумал!». Всё, что ты натворил внутри транзакции, откатывается к чертям собачьим, как будто ничего и не было. Спасение от пиздеца.
  • SAVEPOINT savepoint_name — «Стоп, тут я поставлю зарубку». Создаёшь точку отката прямо внутри транзакции, на случай если дальше пойдёт по пизде.
  • ROLLBACK TO SAVEPOINT savepoint_name — «Всё, нахуй эту затею, откатываемся к зарубке». Отменяешь не всю транзакцию, а только то, что сделал после этой точки.

2. Как это выглядит в PHP, если ты адекватный и используешь PDO:

$pdo = new PDO($dsn, $user, $pass);

$pdo->beginTransaction(); // Говорим БД: "Внимание, ща будет магия"
try {
    // Допустим, списываем сотку с первого счёта
    $stmt1 = $pdo->prepare("UPDATE accounts SET balance = balance - ? WHERE id = ?");
    $stmt1->execute([100.00, 1]);

    // И закидываем её на второй
    $stmt2 = $pdo->prepare("UPDATE accounts SET balance = balance + ? WHERE id = ?");
    $stmt2->execute([100.00, 2]);

    // Если дошли сюда без ошибок — красота, коммитим
    $pdo->commit();
    echo "Деньги переведены, все довольны.";
} catch (Exception $e) {
    // Если где-то посередке ебнулась ошибка — всё откатываем нахуй
    $pdo->rollBack();
    echo "Транзакция накрылась медным тазом: " . $e->getMessage();
}

Вот это и есть атомарность, ёпта! Либо оба апдейта пройдут, либо нихуя. Никаких промежуточных состояний, когда деньги уже списались, но потерялись в пути. Доверия ебать ноль к сетям и серверам, поэтому так и делаем.

3. Ну а если ты, ядрёна вошь, всё ещё на MySQLi сидишь, то вот:

$mysqli->begin_transaction(); // или $mysqli->autocommit(FALSE); — суть та же
try {
    $mysqli->query("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
    $mysqli->query("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
    $mysqli->commit();
} catch (Exception $e) {
    $mysqli->rollback();
}

Короче, вся суть этих ACID-свойств, особенно атомарности, в том, чтобы не было вот этого: «ой, один запрос прошёл, а второй — хуй с горы». Либо всё, либо чих-пых тебя в сраку и откат. Запомни это, и будет тебе счастье, а не расхождения в данных.