function DatabaseConnection::rollback

Rolls back the transaction entirely or to a named savepoint.

This method throws an exception if no transaction is active.

Parameters

$savepoint_name: The name of the savepoint. The default, 'drupal_transaction', will roll the entire transaction back.

Throws

DatabaseTransactionNoActiveException

See also

DatabaseTransaction::rollback()

2 calls to DatabaseConnection::rollback()
DatabaseConnection_mysql::rollback in includes/database/mysql/database.inc
Rolls back the transaction entirely or to a named savepoint.
DatabaseConnection_sqlite::rollback in includes/database/sqlite/database.inc
Rolls back the transaction entirely or to a named savepoint.
2 methods override DatabaseConnection::rollback()
DatabaseConnection_mysql::rollback in includes/database/mysql/database.inc
Rolls back the transaction entirely or to a named savepoint.
DatabaseConnection_sqlite::rollback in includes/database/sqlite/database.inc
Rolls back the transaction entirely or to a named savepoint.

File

includes/database/database.inc, line 1103

Class

DatabaseConnection
Base Database API class.

Code

public function rollback($savepoint_name = 'drupal_transaction') {
    if (!$this->supportsTransactions()) {
        return;
    }
    if (!$this->inTransaction()) {
        throw new DatabaseTransactionNoActiveException();
    }
    // A previous rollback to an earlier savepoint may mean that the savepoint
    // in question has already been accidentally committed.
    if (!isset($this->transactionLayers[$savepoint_name])) {
        throw new DatabaseTransactionNoActiveException();
    }
    // We need to find the point we're rolling back to, all other savepoints
    // before are no longer needed. If we rolled back other active savepoints,
    // we need to throw an exception.
    $rolled_back_other_active_savepoints = FALSE;
    while ($savepoint = array_pop($this->transactionLayers)) {
        if ($savepoint == $savepoint_name) {
            // If it is the last the transaction in the stack, then it is not a
            // savepoint, it is the transaction itself so we will need to roll back
            // the transaction rather than a savepoint.
            if (empty($this->transactionLayers)) {
                break;
            }
            $this->query('ROLLBACK TO SAVEPOINT ' . $savepoint);
            $this->popCommittableTransactions();
            if ($rolled_back_other_active_savepoints) {
                throw new DatabaseTransactionOutOfOrderException();
            }
            return;
        }
        else {
            $rolled_back_other_active_savepoints = TRUE;
        }
    }
    $this->connection
        ->rollBack();
    if ($rolled_back_other_active_savepoints) {
        throw new DatabaseTransactionOutOfOrderException();
    }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.