function TransactionTest::testCommitAfterRollbackSameSavepoint
Tests savepoint transaction commit after rollback.
File
-
core/
tests/ Drupal/ KernelTests/ Core/ Database/ TransactionTest.php, line 260
Class
- TransactionTest
- Tests the transactions, using the explicit ::commitOrRelease method.
Namespace
Drupal\KernelTests\Core\DatabaseCode
public function testCommitAfterRollbackSameSavepoint() : void {
$transaction = $this->createRootTransaction();
$savepoint = $this->createFirstSavepointTransaction();
// Rollback savepoint. It should get released too. Corresponds to 'ROLLBACK
// TO savepoint_1' plus 'RELEASE savepoint_1' on the database.
$savepoint->rollBack();
$this->assertRowPresent('David');
$this->assertRowAbsent('Roger');
$this->assertTrue($this->connection
->inTransaction());
$this->assertSame(1, $this->connection
->transactionManager()
->stackDepth());
// Insert a row.
$this->insertRow('Syd');
// Try releasing savepoint. Should fail since it was released already.
try {
$savepoint->commitOrRelease();
$this->fail('Expected TransactionOutOfOrderException was not thrown');
} catch (\Exception $e) {
$this->assertInstanceOf(TransactionOutOfOrderException::class, $e);
$this->assertMatchesRegularExpression("/^Error attempting commit of .*\\\\savepoint_1\\. Active stack: .*\\\\drupal_transaction/", $e->getMessage());
}
$this->assertRowPresent('David');
$this->assertRowAbsent('Roger');
$this->assertRowPresent('Syd');
$this->assertTrue($this->connection
->inTransaction());
$this->assertSame(1, $this->connection
->transactionManager()
->stackDepth());
// Commit root.
$transaction->commitOrRelease();
$this->assertRowPresent('David');
$this->assertRowAbsent('Roger');
$this->assertRowPresent('Syd');
$this->assertFalse($this->connection
->inTransaction());
$this->assertSame(0, $this->connection
->transactionManager()
->stackDepth());
}
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.