2013-12-11 34 views
0

當您運行PDO::beginTransaction時,如果由於任何原因腳本結束並且更改沒有被明確提交(錯誤,例外,exit/die等),則事務將會被回滾。PDO :: rollBack或__destruct

同樣,腳本結束時,同樣會執行任何對象中存在的任何方法。

所以,我的問題是,如果腳本結束,並有一個優秀的數據庫事務,首先被調用,PDO::rollBack__destruct方法?

回答

4

當PHP腳本結束並且存在未完成的PDO事務時,PHP根本不調用PDO::rollBack,而是一旦PHP關閉到服務器的連接,任何剩餘的事務就會由數據庫服務器自身回滾這發生在執行任何destructorsshutdown functions之後。

因此,如果我們有以下幾點:

$dbh = get_dbh(); 

class Test 
{ 
    public function __construct(PDO $dbh) 
    { 
     $this->_dbh = $dbh; 
    } 

    public function __destruct() 
    { 
     $stmt = $this->_dbh->prepare(" 
      UPDATE some_table 
      SET some_column = :val"); 
     $stmt->bindValue('val', time()); 
     $stmt->execute(); 
    } 
} 

$test = new Test($dbh); 

$dbh->beginTransaction(); 

// End of file 

__destruct方法查詢將被執行,然後立即回滾。

+0

使用谷歌找到一個明確的聲明,說如果PHP在有事務進行時退出,那麼更改就會回滾,就好像調用了$ dbh-> rollback()一樣,這是令人驚訝的困難。我猜這是因爲我在搜索與PHP和PDO相關的內容,而實際上它是數據庫的一個屬性,當事務開始的連接關閉時! – sootsnoot