函数调用可以在PDO事务块中发生吗?这是简化的代码(使用MySql数据库)......
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();
}
如果使用交易无法做到这一点,推荐的策略是什么?
答案 0 :(得分:13)
除非这些函数调用中的任何一个尝试自己打开或提交事务,或者使用与$db
中存储的连接不同的连接,否则它应该可以正常工作。
PDO对象(或者RDBMS)不知道或不关心您是否在调用PHP中的其他函数。所有它知道的是,该动作是否发生在与$db
中打开的连接相同的开放连接上。我们假设这些函数接收$db
作为参数或全局访问它。
请记住,尽管PDO会跟踪事务状态(通过PDO::inTransaction()
公开),但它实际上是管理事务状态的RDBMS,而不是PDO或PHP应用程序代码。如果函数尝试在上一个事务提交之前打开新事务,则MySQL's documented behavior将自动提交上一个事务,因为它不支持事务嵌套。
因此,请确保您的其他函数调用不会尝试更改事务状态。