2009-12-27 45 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處理的所有數據庫查詢都將成爲該事務的一部分。

相關問題