📖 Scenario: You are building a simple PHP script to manage a bank account transaction. You want to make sure that money is only withdrawn if there is enough balance, and if something goes wrong, the transaction should be canceled.
🎯 Goal: Create a PHP script that uses transaction management to safely withdraw money from a bank account balance stored in a variable.
📋 What You'll Learn
Create a variable $balance with the initial amount of 1000
Create a variable $withdraw with the amount to withdraw, 300
Use transaction management with try and catch blocks
Check if $balance is enough for the withdrawal
If enough, subtract $withdraw from $balance
If not enough, throw an exception with message 'Insufficient funds'
Print the final balance or the error message
💡 Why This Matters
🌍 Real World
Transaction management is important in banking and shopping websites to keep data safe and consistent.
💼 Career
Understanding how to use transactions and error handling is a key skill for backend developers working with databases.
Progress0 / 4 steps
1
Set up initial balance and withdrawal amount
Create a variable called $balance and set it to 1000. Then create a variable called $withdraw and set it to 300.
PHP
Hint
Use simple variable assignment like $balance = 1000;
2
Start transaction with try block
Add a try block to start the transaction management. Inside it, write a comment // Transaction starts.
PHP
Hint
Use try { } to start the transaction block.
3
Check balance and update inside try block
Inside the try block, write an if statement to check if $balance is greater than or equal to $withdraw. If yes, subtract $withdraw from $balance. Otherwise, throw a new Exception with the message 'Insufficient funds'. Add a catch block to catch Exception as $e.
PHP
Hint
Use throw new Exception('Insufficient funds'); to stop the transaction if balance is low.
4
Print the final balance or error message
After the try-catch block, write an if statement to check if $error is set. If yes, print 'Error: ' followed by $error. Otherwise, print 'Final balance: ' followed by $balance.
PHP
Hint
Use print("Final balance: $balance\n"); to show the result.
Practice
(1/5)
1. What is the main purpose of using beginTransaction() in PHP when working with databases?
easy
A. To start a group of database operations that can be committed or rolled back together
B. To immediately save changes to the database
C. To close the database connection
D. To check if the database is available
Solution
Step 1: Understand the role of beginTransaction()
This function starts a transaction, grouping multiple database changes into one unit.
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 A
Quick Check:
beginTransaction() starts a transaction [OK]
Hint: beginTransaction() starts safe grouped DB changes [OK]
Common Mistakes:
Thinking it saves changes immediately
Confusing it with closing the connection
Assuming it checks database availability
2. Which of the following is the correct syntax to commit a transaction in PHP PDO?
easy
A. $pdo->commitTransaction();
B. $pdo->transactionCommit();
C. commit($pdo);
D. $pdo->commit();
Solution
Step 1: Recall PDO commit method
The correct method to save all changes in a transaction is commit() 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 D
Quick Check:
commit() saves transaction changes [OK]
Hint: Use $pdo->commit() to save transaction changes [OK]
Common Mistakes:
Using incorrect method names like commitTransaction()
Trying to call commit as a function with argument
Confusing commit with rollback
3. What will be the output of the following PHP code snippet?
$pdo->beginTransaction();
$pdo->exec("INSERT INTO users (name) VALUES ('Alice')");
$pdo->rollBack();
echo $pdo->query("SELECT COUNT(*) FROM users")->fetchColumn();
medium
A. 0
B. 1
C. SyntaxError
D. Throws Exception
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 A
Quick Check:
rollBack() undoes insert, count = 0 [OK]
Hint: rollBack() cancels changes, so count stays zero [OK]
Common Mistakes:
Assuming insert stays after rollBack()
Confusing commit() with rollBack()
Expecting syntax or runtime error
4. Identify the error in this PHP transaction code:
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();
}
medium
A. Missing beginTransaction() call
B. Using commit() in catch block instead of rollBack()
C. No exception handling block
D. Using exec() instead of query()
Solution
Step 1: Review transaction error handling
In case of error, changes should be undone with rollBack(), not committed.
Step 2: Identify catch block mistake
The catch block incorrectly calls commit(), which saves partial or faulty changes.
Final Answer:
Using commit() in catch block instead of rollBack() -> Option B
Quick Check:
Errors need rollBack(), not commit() [OK]
Hint: Use rollBack() on error, not commit() [OK]
Common Mistakes:
Calling commit() in catch block
Forgetting to handle exceptions
Confusing exec() and query() methods
5. You want to transfer money between two accounts safely using PHP transactions. Which of the following sequences of steps is correct?
hard
A. Begin transaction, update sender balance, commit transaction, update receiver balance
B. Update sender balance, update receiver balance, begin transaction, commit transaction
C. Begin transaction, update sender balance, update receiver balance, commit transaction
D. Update sender balance, begin transaction, update receiver balance, commit transaction
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 C
Quick Check:
All DB changes inside transaction before commit [OK]
Hint: Start transaction before updates, commit after all done [OK]
Common Mistakes:
Updating before starting transaction
Committing too early before all updates
Not grouping all changes inside transaction
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.