Can function calls occur within a PDO transaction block? This is simplified code (using MySql database)...
try{
$db->beginTransaction();
// call to function that creates user
$user_id = create_user();
// call to function that creates company
$company_id = create_company();
// call to function to link user & company
add_user_to_company($user_id, $company_id);
$db->commit();
}
If this can't happen using transactions, what is the recommended strategy?
Introduction to PHP PDO transaction It means that the changes made to the database via the PDO object won't take effect until you call the PDO::commit() method. To commit a transaction, you call the PDO::commit() method: $pdo->commit(); Code language: PHP (php)
PDO provides a data-access abstraction layer, which means that, regardless of which database you're using, you use the same functions to issue queries and fetch data. PDO does not provide a database abstraction; it doesn't rewrite SQL or emulate missing features.
Transaction means to complete several actions of a group without any interruption and if something wrong happens then revert everything to the initial stage. In SQL, successful transaction means that all SQL statements has been executed successfully.
PDO (PHP Data Objects) is a general database abstraction layer with support for MySQL among many other databases. It provides prepared statements, and significant flexibility in how data is returned.
Unless any of those function calls attempts to open or commit a transaction themselves, or use a different connection than the one stored in $db
, yes it should work just fine.
The PDO object (or the RDBMS for that matter) doesn't know or care whether you are calling other functions in PHP. All it knows is if the action is taking place on the same open connection as the one opened in $db
. We assume that those functions either receive $db
as a parameter or access it globally.
Remember that although PDO keeps track of transaction state (exposed through PDO::inTransaction()
), it is really the RDBMS which is managing the transaction state, not PDO or the PHP application code. If, a function attempts to open a new transaction before the previous one was committed, MySQL's documented behavior is to auto-commit the previous transaction since it does not support transaction nesting.
So just be sure your additional function calls are not attempting to change the transaction state.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With