0
當您運行PDO::beginTransaction
時,如果由於任何原因腳本結束並且更改沒有被明確提交(錯誤,例外,exit
/die
等),則事務將會被回滾。PDO :: rollBack或__destruct
同樣,腳本結束時,同樣會執行任何對象中存在的任何方法。
所以,我的問題是,如果腳本結束,並有一個優秀的數據庫事務,首先被調用,PDO::rollBack
或__destruct
方法?
當您運行PDO::beginTransaction
時,如果由於任何原因腳本結束並且更改沒有被明確提交(錯誤,例外,exit
/die
等),則事務將會被回滾。PDO :: rollBack或__destruct
同樣,腳本結束時,同樣會執行任何對象中存在的任何方法。
所以,我的問題是,如果腳本結束,並有一個優秀的數據庫事務,首先被調用,PDO::rollBack
或__destruct
方法?
當PHP腳本結束並且存在未完成的PDO事務時,PHP根本不調用PDO::rollBack
,而是一旦PHP關閉到服務器的連接,任何剩餘的事務就會由數據庫服務器自身回滾這發生在執行任何destructors或shutdown 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
方法查詢將被執行,然後立即回滾。
使用谷歌找到一個明確的聲明,說如果PHP在有事務進行時退出,那麼更改就會回滾,就好像調用了$ dbh-> rollback()一樣,這是令人驚訝的困難。我猜這是因爲我在搜索與PHP和PDO相關的內容,而實際上它是數據庫的一個屬性,當事務開始的連接關閉時! – sootsnoot