Php PDO交易及;函数调用

Php PDO交易及;函数调用,php,mysql,transactions,pdo,Php,Mysql,Transactions,Pdo,函数调用能否发生在PDO事务块中?这是简化的代码(使用MySql数据库) 如果使用事务无法实现这一点,建议采用什么策略?除非这些函数调用中的任何一个函数试图自己打开或提交事务,或者使用与存储在$db中的连接不同的连接,否则它应该可以正常工作。 PDO对象(或RDBMS)不知道或不关心您是否在PHP中调用其他函数。它只知道操作是否发生在与在$db中打开的连接相同的打开连接上。我们假设这些函数要么接收$db作为参数,要么全局访问它 请记住,尽管PDO跟踪事务状态(通过PDO::inTransacti

函数调用能否发生在PDO事务块中?这是简化的代码(使用MySql数据库)


如果使用事务无法实现这一点,建议采用什么策略?

除非这些函数调用中的任何一个函数试图自己打开或提交事务,或者使用与存储在
$db
中的连接不同的连接,否则它应该可以正常工作。 PDO对象(或RDBMS)不知道或不关心您是否在PHP中调用其他函数。它只知道操作是否发生在与在
$db
中打开的连接相同的打开连接上。我们假设这些函数要么接收
$db
作为参数,要么全局访问它

请记住,尽管PDO跟踪事务状态(通过
PDO::inTransaction()
公开),但真正管理事务状态的是RDBMS,而不是PDO或PHP应用程序代码。如果函数在提交前一个事务之前尝试打开新事务,则会自动提交前一个事务,因为它不支持事务嵌套


因此,只需确保您的附加函数调用没有试图更改事务状态。

为了进一步澄清,MySQL不支持嵌套事务,因此请确保您没有在任何函数中启动事务,否则它会启动。同时确保不要使用任何类型的DDL(create/alter/drop语句)因为他们将提交您正在进行的任何事务。
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();  
}