Returns the current transaction nesting level.
public getTransactionNestingLevel ( ) : integer | ||
return | integer | The nesting level. A value of 0 means there's no active transaction. |
/** * Begin transaction */ public function beginTransaction() { if (0 != $this->connection->getTransactionNestingLevel()) { throw new \RuntimeException('Transaction already started'); } $this->connection->beginTransaction(); }
/** * Rolls back the transaction. * It makes sure that the connection is in the correct state regardless of what happened before. * Correct state means that connection is not rollback only and does not have a transaction nesting level > 0 * * @throws \Exception */ public function rollBack() { try { /** * Roll back all the way as this is supposed to be the top level transaction and we want to reset * the nesting level */ $transactionNestingLevel = $this->connection->getTransactionNestingLevel(); for ($i = 0; $i < $transactionNestingLevel - 1; $i++) { $this->connection->rollBack(); } $this->connection->rollBack(); } catch (\Exception $e) { $rethrowable = $this->attemptToReconnectPresumedLostConnection($e); /** * If connection is functional we need to make sure the connection is not rollback only. * This can only be achieved by starting a transaction and rolling it back (the "why" is found in * lines 1277-1279 of Doctrine\DBAL\Connection). */ if ($rethrowable === $e) { $this->connection->beginTransaction(); $this->connection->rollBack(); } throw $rethrowable; } }
/** * @group DBAL-81 */ public function testSwitchingAutoCommitModeCommitsAllCurrentTransactions() { $driverMock = $this->getMock('Doctrine\\DBAL\\Driver'); $driverMock->expects($this->any())->method('connect')->will($this->returnValue(new DriverConnectionMock())); $conn = new Connection(array('platform' => new Mocks\MockPlatform()), $driverMock); $conn->connect(); $conn->beginTransaction(); $conn->beginTransaction(); $conn->setAutoCommit(false); $this->assertSame(1, $conn->getTransactionNestingLevel()); $conn->beginTransaction(); $conn->beginTransaction(); $conn->setAutoCommit(true); $this->assertFalse($conn->isTransactionActive()); }