protected function Connection::popCommittableTransactions in Zircon Profile 8
Same name in this branch
- 8 core/lib/Drupal/Core/Database/Connection.php \Drupal\Core\Database\Connection::popCommittableTransactions()
- 8 core/lib/Drupal/Core/Database/Driver/mysql/Connection.php \Drupal\Core\Database\Driver\mysql\Connection::popCommittableTransactions()
Same name and namespace in other branches
- 8.0 core/lib/Drupal/Core/Database/Driver/mysql/Connection.php \Drupal\Core\Database\Driver\mysql\Connection::popCommittableTransactions()
Overridden to work around issues to MySQL not supporting transactional DDL.
Overrides Connection::popCommittableTransactions
File
- core/
lib/ Drupal/ Core/ Database/ Driver/ mysql/ Connection.php, line 292 - Contains \Drupal\Core\Database\Driver\mysql\Connection.
Class
- Connection
- MySQL implementation of \Drupal\Core\Database\Connection.
Namespace
Drupal\Core\Database\Driver\mysqlCode
protected function popCommittableTransactions() {
// Commit all the committable layers.
foreach (array_reverse($this->transactionLayers) as $name => $active) {
// Stop once we found an active transaction.
if ($active) {
break;
}
// If there are no more layers left then we should commit.
unset($this->transactionLayers[$name]);
if (empty($this->transactionLayers)) {
if (!$this->connection
->commit()) {
throw new TransactionCommitFailedException();
}
}
else {
// Attempt to release this savepoint in the standard way.
try {
$this
->query('RELEASE SAVEPOINT ' . $name);
} catch (DatabaseExceptionWrapper $e) {
// However, in MySQL (InnoDB), savepoints are automatically committed
// when tables are altered or created (DDL transactions are not
// supported). This can cause exceptions due to trying to release
// savepoints which no longer exist.
//
// To avoid exceptions when no actual error has occurred, we silently
// succeed for MySQL error code 1305 ("SAVEPOINT does not exist").
if ($e
->getPrevious()->errorInfo[1] == '1305') {
// If one SAVEPOINT was released automatically, then all were.
// Therefore, clean the transaction stack.
$this->transactionLayers = array();
// We also have to explain to PDO that the transaction stack has
// been cleaned-up.
$this->connection
->commit();
}
else {
throw $e;
}
}
}
}
}