Transaction management helps keep your data safe and correct when you make multiple changes at once.
Transaction management in PHP
<?php $pdo->beginTransaction(); // run queries $pdo->commit(); // or if error $pdo->rollBack(); ?>
Use beginTransaction() to start a transaction.
Use commit() to save all changes if everything is fine.
<?php
$pdo->beginTransaction();
$pdo->exec("INSERT INTO users (name) VALUES ('Alice')");
$pdo->commit();
?><?php $pdo->beginTransaction(); try { $pdo->exec("UPDATE accounts SET balance = balance - 100 WHERE id = 1"); $pdo->exec("UPDATE accounts SET balance = balance + 100 WHERE id = 2"); $pdo->commit(); } catch (Exception $e) { $pdo->rollBack(); } ?>
This program creates two accounts, then safely transfers 200 from Alice to Bob using a transaction. If anything goes wrong, it cancels the transfer.
<?php $pdo = new PDO('sqlite::memory:'); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Create table $pdo->exec("CREATE TABLE accounts (id INTEGER PRIMARY KEY, name TEXT, balance INTEGER)"); // Insert initial data $pdo->exec("INSERT INTO accounts (name, balance) VALUES ('Alice', 500), ('Bob', 300)"); try { $pdo->beginTransaction(); // Alice sends 200 to Bob $pdo->exec("UPDATE accounts SET balance = balance - 200 WHERE name = 'Alice'"); $pdo->exec("UPDATE accounts SET balance = balance + 200 WHERE name = 'Bob'"); $pdo->commit(); echo "Transaction completed successfully.\n"; } catch (Exception $e) { $pdo->rollBack(); echo "Transaction failed: " . $e->getMessage() . "\n"; } // Show final balances $stmt = $pdo->query("SELECT name, balance FROM accounts"); foreach ($stmt as $row) { echo $row['name'] . ': ' . $row['balance'] . "\n"; }
Always set error mode to PDO::ERRMODE_EXCEPTION to catch errors easily.
Use rollBack() to undo changes if something goes wrong.
Transactions work only if your database supports them (like MySQL InnoDB, PostgreSQL, SQLite).
Transaction management groups multiple database changes into one safe action.
Use beginTransaction(), commit(), and rollBack() to control transactions.
This helps keep your data correct and avoids partial updates.
Practice
beginTransaction() in PHP when working with databases?Solution
Step 1: Understand the role of
This function starts a transaction, grouping multiple database changes into one unit.beginTransaction()Step 2: Recognize transaction benefits
It allows committing all changes at once or rolling back if something goes wrong, ensuring data integrity.Final Answer:
To start a group of database operations that can be committed or rolled back together -> Option AQuick Check:
beginTransaction() starts a transaction [OK]
- Thinking it saves changes immediately
- Confusing it with closing the connection
- Assuming it checks database availability
Solution
Step 1: Recall PDO commit method
The correct method to save all changes in a transaction iscommit()called on the PDO object.Step 2: Check method names
Only$pdo->commit();matches the correct PDO syntax; others are invalid method names.Final Answer:
$pdo->commit(); -> Option DQuick Check:
commit() saves transaction changes [OK]
- Using incorrect method names like commitTransaction()
- Trying to call commit as a function with argument
- Confusing commit with rollback
$pdo->beginTransaction();
$pdo->exec("INSERT INTO users (name) VALUES ('Alice')");
$pdo->rollBack();
echo $pdo->query("SELECT COUNT(*) FROM users")->fetchColumn();Solution
Step 1: Analyze transaction commands
The code starts a transaction, inserts a user, then rolls back, undoing the insert.Step 2: Check final data count
Since the insert was rolled back, the users table remains unchanged, so count is 0.Final Answer:
0 -> Option AQuick Check:
rollBack() undoes insert, count = 0 [OK]
- Assuming insert stays after rollBack()
- Confusing commit() with rollBack()
- Expecting syntax or runtime error
try {
$pdo->beginTransaction();
$pdo->exec("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
$pdo->exec("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
$pdo->commit();
} catch (Exception $e) {
$pdo->commit();
}Solution
Step 1: Review transaction error handling
In case of error, changes should be undone withrollBack(), not committed.Step 2: Identify catch block mistake
The catch block incorrectly callscommit(), which saves partial or faulty changes.Final Answer:
Using commit() in catch block instead of rollBack() -> Option BQuick Check:
Errors need rollBack(), not commit() [OK]
- Calling commit() in catch block
- Forgetting to handle exceptions
- Confusing exec() and query() methods
Solution
Step 1: Understand transaction grouping
All related updates must be inside the transaction to ensure atomicity.Step 2: Check step order
Starting with beginTransaction(), then updating both accounts, and finally committing ensures either all changes apply or none.Final Answer:
Begin transaction, update sender balance, update receiver balance, commit transaction -> Option CQuick Check:
All DB changes inside transaction before commit [OK]
- Updating before starting transaction
- Committing too early before all updates
- Not grouping all changes inside transaction
Ready to prove it?
Pass the test and this pattern moves unknown
