2009-12-27 52 views
0

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

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

我试着问:必须在事务开始和COMMITED内的一个范围,或者我可以跨越一个交易在广泛的功能和方法调用?对我来说,被调用的对象不关心调用者是合乎逻辑的。但是在Objective-C/Cocoa中,例如,UIView动画块是可识别范围的!所以我很困惑,就像飞机上的一只鸟。

+0

我不明白为什么它应该在意,只要你将指针放在它的周围就不要紧,谁在使用它,甚至包括一个不同的脚本。 如果脚本停止执行然后再次启动,或者如果您将它放置在较长时间的睡眠状态,您将失去它。 只需将sql_query()保存到一些私人成员以备后用,它应该没有问题。 顺便说一句,该函数调用看起来不错。 – Tom 2009-12-27 16:38:37

回答

2

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

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


作为一个旁注:你正在使用您的示例中此功能:

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

只要注意(不知道是否是因为你写了一个简单的例子,或者如果它是一个真正的错误)$dbh将不会在该函数中存在,除非您将其声明为global,或将其作为参数传递 - 请参见手册中的Variable scope

+0

感谢您的支持。我很快就把这个例子砍进了编辑器:) – openfrog 2009-12-27 16:37:59

+0

@openfrog:不客气:-)我不确定,所以我最好写一个便条,以防万一:-) – 2009-12-27 16:40:27

0

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

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

相关问题