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 的基于 PHP 类的用户系统 - 在非对象上调用成员函数 prepare()
PDO 致命错误:在非对象上调用成员函数 prepare()
致命错误:在非对象上调用成员函数 fetchALL() - 在 Microsoft Access 数据库上使用 PDO