MySQL Transactions in PHP (Commit and Rollback)
Learn how to safely update multiple tables using transactions so your data never becomes inconsistent.
Brandon Foster
October 17, 2025
5.3k248
A transaction means: “either everything succeeds, or nothing changes.”
This is critical in real apps:
- placing an order (order + order_items + payment log)
- transferring money (debit + credit)
- updating inventory + creating invoice
The problem without transactions
If you insert the order, then fail inserting order_items, your database becomes messy.
Transaction flow
flowchart TD
A[Begin Transaction] --> B[Query 1]
B --> C[Query 2]
C --> D{All OK?}
D -->|Yes| E[Commit]
D -->|No| F[Rollback]
Example: Create order + items
<?php
require_once "config.php";
try {
$pdo->beginTransaction();
$stmt = $pdo->prepare("INSERT INTO orders (user_id, total) VALUES (:user_id, :total)");
$stmt->execute(["user_id" => $userId, "total" => $total]);
$orderId = (int)$pdo->lastInsertId();
$itemStmt = $pdo->prepare(
"INSERT INTO order_items (order_id, product_id, qty, price) VALUES (:order_id, :product_id, :qty, :price)"
);
foreach ($items as $it) {
$itemStmt->execute([
"order_id" => $orderId,
"product_id" => $it["product_id"],
"qty" => $it["qty"],
"price" => $it["price"],
]);
}
$pdo->commit();
echo "Order created successfully";
} catch (Throwable $e) {
$pdo->rollBack();
echo "Order failed safely (no partial data saved)";
}
?>
Pro tip
Use transactions whenever multiple queries must stay consistent.
Next: Database indexing, why some queries become slow and how to fix them.
#PHP#MySQL#PDO#Advanced