PDO 事务和函数调用

Posted

技术标签:

【中文标题】PDO 事务和函数调用【英文标题】:PDO Transactions & function calls 【发布时间】:2012-05-17 00:45:15 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

因此,请确保您的附加函数调用不会尝试更改事务状态。

【讨论】:

为了进一步说明,MySQL 不支持嵌套事务,因此请确保您没有在任何函数中启动事务,否则会automatically commit the pending transaction。 另外,请确保不要使用任何类型的 DDL(创建/更改/删除语句),因为它们会提交您正在进行的任何事务。

以上是关于PDO 事务和函数调用的主要内容,如果未能解决你的问题,请参考以下文章

不能在类外调用 PDO 中的函数

带有 PDO 的基于 PHP 类的用户系统 - 在非对象上调用成员函数 prepare()

PDO 致命错误:在非对象上调用成员函数 prepare()

致命错误:在非对象上调用成员函数 fetchALL() - 在 Microsoft Access 数据库上使用 PDO

PHP IIS7 MSSQL调用未定义的函数sqlsrv_connect

PHP PDO:致命错误:未捕获的错误:在第[duplicate]行上对bool成员函数execute()的调用