【问题标题】:PDO Transactions & function callsPDO 事务和函数调用
【发布时间】: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();  
}

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

【问题讨论】:

    标签: php mysql transactions pdo


    【解决方案1】:

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

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

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

    【讨论】:

    • 为了进一步说明,MySQL 不支持嵌套事务,因此请确保您没有在任何函数中启动事务,否则会automatically commit the pending transaction
    • 另外,请确保不要使用任何类型的 DDL(创建/更改/删除语句),因为它们会提交您正在进行的任何事务。
    猜你喜欢
    • 2015-02-12
    • 2015-09-30
    • 1970-01-01
    • 2012-09-26
    • 2012-04-26
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    相关资源
    最近更新 更多