Ответ
Для управления транзакциями в 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-свойств, особенно атомарности, в том, чтобы не было вот этого: «ой, один запрос прошёл, а второй — хуй с горы». Либо всё, либо чих-пых тебя в сраку и откат. Запомни это, и будет тебе счастье, а не расхождения в данных.