【问题标题】:When I call beginTransaction(), must all executions follow in the same scope?当我调用 beginTransaction() 时,所有执行都必须遵循相同的范围吗?
【发布时间】:2009-12-27 16:30:02
【问题描述】:

例子:

// assume PDO instance here: $dbh

function beginTransaction() {
   global $dbh;
   $dbh->beginTransaction();
}

beginTransaction(); // no typo! called the function above!

$dbh->exec($sql1); // assume $sql1 is there
$dbh->exec($sql2); // assume $sql2 is there

$dbh->commit();

我想问的是:必须在 ONE 范围内启动和提交事务,还是可以将事务跨越广泛的函数和方法调用?对我来说,被调用对象不关心调用者是合乎逻辑的。但是例如在 Objective-C / Cocoa 中,UIView 动画块是范围感知的!所以我就像飞机上的鸟一样困惑。

【问题讨论】:

  • 我不明白为什么它应该关心,只要你把指针放在它周围,谁在使用它,即使是不同的包含脚本也不重要。如果脚本停止执行然后再次启动,或者如果你让它休眠很长一段时间,你就会失去它。只需将 sql_query() 保存到某个私有成员以供以后使用,它应该没有问题。顺便说一句,那个函数调用看起来不错。

标签: php


【解决方案1】:

一个事务可以跨越多个函数和方法调用:事务发生在数据库端,而不是 PHP 端。

PHP 中的beginTransaction 只发送“BEGIN TRAN(或等效的) 到数据库;然后,由数据库服务器负责事务 -- PHP 只发送 SQL 命令。


作为旁注:您在示例中使用此功能:

function beginTransaction() {
   $dbh->beginTransaction();
}

请注意(不确定是因为你写了一个简单的示例,还是真的有错误) $dbh 不会存在于该函数中,除非你将其声明为 global , 或将其作为参数传递——参见手册中的Variable scope

【讨论】:

  • 感谢您的旁注。我迅速将示例破解到编辑器中:)
  • @openfrog : 不客气 :-) 我不确定,所以我更喜欢写个便条,以防万一:-)
【解决方案2】:

事务绑定到 $dbh 对象,我假设它是一个 PDO 句柄。它与您当前的范围无关。

如果在调用 $dbh->beginTransaction() 之后执行所有由 $dbh 处理的数据库查询,它们都将成为该事务的一部分。

【讨论】:

    猜你喜欢
    • 2016-11-07
    • 2021-11-28
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 2020-09-26
    • 2018-02-28
    相关资源
    最近更新 更多