当我调用beginTransaction()时,所有执行都必须遵循相同的范围吗?

时间:2009-12-27 16:30:03

标签: php

示例:

// 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();

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

2 个答案:

答案 0 :(得分:2)

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

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


作为旁注:您在示例中使用此函数:

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

请注意(不确定是不是因为你写了一个快速的例子,或者这是一个真正的错误) $dbh在该函数中不存在,除非你将它声明为{ {3}},或将其作为参数传递 - 请参阅手册中的global

答案 1 :(得分:0)

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

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