Error message
You are browsing documentation for drupal 7.x, which is not supported anymore. Read the updated version of this page for drupal 11.x (the latest version).function DatabaseTransactionTestCase::testTransactionWithDdlStatement
Test the compatibility of transactions with DDL statements.
File
-
modules/
simpletest/ tests/ database_test.test, line 3916
Class
- DatabaseTransactionTestCase
- Test transaction support, particularly nesting.
Code
function testTransactionWithDdlStatement() {
// First, test that a commit works normally, even with DDL statements.
$transaction = db_transaction ();
$this->insertRow ('row');
$this->executeDDLStatement ();
unset($transaction);
$this->assertRowPresent ('row');
// Even in different order.
$this->cleanUp ();
$transaction = db_transaction ();
$this->executeDDLStatement ();
$this->insertRow ('row');
unset($transaction);
$this->assertRowPresent ('row');
// Even with stacking.
$this->cleanUp ();
$transaction = db_transaction ();
$transaction2 = db_transaction ();
$this->executeDDLStatement ();
unset($transaction2);
$transaction3 = db_transaction ();
$this->insertRow ('row');
unset($transaction3);
unset($transaction);
$this->assertRowPresent ('row');
// A transaction after a DDL statement should still work the same.
$this->cleanUp ();
$transaction = db_transaction ();
$transaction2 = db_transaction ();
$this->executeDDLStatement ();
unset($transaction2);
$transaction3 = db_transaction ();
$this->insertRow ('row');
$transaction3->rollback ();
unset($transaction3);
unset($transaction);
$this->assertRowAbsent ('row');
// The behavior of a rollback depends on the type of database server.
if (Database ::getConnection ()->supportsTransactionalDDL ()) {
// For database servers that support transactional DDL, a rollback
// of a transaction including DDL statements should be possible.
$this->cleanUp ();
$transaction = db_transaction ();
$this->insertRow ('row');
$this->executeDDLStatement ();
$transaction->rollback ();
unset($transaction);
$this->assertRowAbsent ('row');
// Including with stacking.
$this->cleanUp ();
$transaction = db_transaction ();
$transaction2 = db_transaction ();
$this->executeDDLStatement ();
unset($transaction2);
$transaction3 = db_transaction ();
$this->insertRow ('row');
unset($transaction3);
$transaction->rollback ();
unset($transaction);
$this->assertRowAbsent ('row');
}
else {
// For database servers that do not support transactional DDL,
// the DDL statement should commit the transaction stack.
$this->cleanUp ();
$transaction = db_transaction ();
$this->insertRow ('row');
$this->executeDDLStatement ();
set_error_handler (array(
$this,
'rollBackWithoutTransactionErrorHandler',
));
try {
// Rollback the outer transaction.
$transaction->rollback ();
// @see \DatabaseConnection_mysql::rollback()
if (PHP_VERSION_ID >= 80000) {
$this->fail ('Rolling back a transaction containing DDL should produce a warning.');
}
} catch (Exception $e) {
$this->assertEqual ('Rollback attempted when there is no active transaction.', $e->getMessage());
}
restore_error_handler ();
unset($transaction);
$this->assertRowPresent ('row');
}
}
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.