PHP

PDO Transaction Wrapper

admin by @admin ADMIN
Jun 16, 2026
May 31, 2026
Public
0 0 up · 0 down Sign in to vote
Run a closure inside a transaction. Commits on success, rolls back on any exception, then re-throws so the caller can react. Avoids the bug-prone copy-paste of begin/commit/rollBack.
PHP
Raw
<?php
function transaction(PDO $db, callable $fn): mixed {
    $db->beginTransaction();
    try {
        $result = $fn($db);
        $db->commit();
        return $result;
    } catch (Throwable $e) {
        if ($db->inTransaction()) $db->rollBack();
        throw $e;
    }
}

$orderId = transaction($db, function (PDO $db) use ($cart) {
    $db->prepare('INSERT INTO orders (user_id, total) VALUES (?, ?)')
       ->execute([$cart->userId, $cart->total]);
    $orderId = (int)$db->lastInsertId();
    foreach ($cart->items as $i) {
        $db->prepare('INSERT INTO order_items (order_id, sku, qty) VALUES (?,?,?)')
           ->execute([$orderId, $i->sku, $i->qty]);
    }
    return $orderId;
});
Tags

Save your own code snippets

Create a free account and build your private vault. Share publicly whenever you want.