2013-12-11 3 views
0

При запуске PDO::beginTransaction, если по какой-либо причине сценарий заканчивается, и эти изменения не были явно совершены (по ошибке, за исключением, exit/die и т.д.), то сделка будет откат.Что приходит первым, PDO :: отмотки или __destruct

Аналогично, когда скрипт заканчивается, любые __destruct методы, присутствующие в любых объектах, также будут выполнены.

Итак, мой вопрос в том, заканчивается ли сценарий, и есть ли выдающаяся транзакция базы данных, которая сначала вызывается, PDO::rollBack или __destruct?

ответ

4

Когда PHP-скрипт заканчивается и происходит выдающаяся транзакция PDO, PDO::rollBack не вызывается PHP вообще, но вместо этого любые оставшиеся транзакции откатываются самим сервером базы данных, как только 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 будет выполнено, а затем сразу откат.

+0

Было неожиданно сложно использовать google, чтобы найти явный оператор, говорящий о том, что если PHP выходит во время выполнения транзакции, изменения отбрасываются так же, как если бы был вызван вызов $ dbh-> rollback(). Я предполагаю, что это потому, что я искал по отношению к PHP и PDO, в то время как на самом деле это свойство базы данных, когда соединение, на котором была запущена транзакция, закрыто! – sootsnoot

Смежные вопросы