13

函数调用可以发生在 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();  
}

如果使用事务不能做到这一点,推荐的策略是什么?

4

1 回答 1

14

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

请记住,虽然 PDO 跟踪事务状态(通过 公开PDO::inTransaction()),但实际上是 RDBMS 管理事务状态,而不是 PDO 或 PHP 应用程序代码。如果一个函数试图在前一个事务提交之前打开一个新事务,MySQL 的记录行为是自动提交前一个事务,因为它不支持事务嵌套。

所以只要确保你的附加函数调用没有试图改变事务状态。

于 2012-05-08T14:07:29.227 回答