From a60904b9dcf56dd212468259e0124a670a141f48 Mon Sep 17 00:00:00 2001 From: Keith Kirk Date: Fri, 13 May 2016 11:51:49 -0700 Subject: [PATCH 1/3] Decrements transactions count on beginTransaction exception --- src/Illuminate/Database/Connection.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Illuminate/Database/Connection.php b/src/Illuminate/Database/Connection.php index ef55bef4904..1bf681453f6 100755 --- a/src/Illuminate/Database/Connection.php +++ b/src/Illuminate/Database/Connection.php @@ -498,13 +498,20 @@ public function transaction(Closure $callback) * Start a new database transaction. * * @return void + * @throws Exception */ public function beginTransaction() { ++$this->transactions; if ($this->transactions == 1) { - $this->pdo->beginTransaction(); + try { + $this->pdo->beginTransaction(); + } catch(Exception $e) { + --$this->transactions; + + throw $e; + } } elseif ($this->transactions > 1 && $this->queryGrammar->supportsSavepoints()) { $this->pdo->exec( $this->queryGrammar->compileSavepoint('trans'.$this->transactions) From cb77e6e5a31640a13c714a365947510d5a0a4d22 Mon Sep 17 00:00:00 2001 From: Keith Kirk Date: Fri, 13 May 2016 11:52:25 -0700 Subject: [PATCH 2/3] Adds test cases for successful and failed beginTransaction calls --- tests/Database/DatabaseConnectionTest.php | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/tests/Database/DatabaseConnectionTest.php b/tests/Database/DatabaseConnectionTest.php index 0990a15aa2d..2eb78496759 100755 --- a/tests/Database/DatabaseConnectionTest.php +++ b/tests/Database/DatabaseConnectionTest.php @@ -111,6 +111,27 @@ public function testAffectingStatementProperlyCallsPDO() $this->assertTrue(is_numeric($log[0]['time'])); } + public function testTransactionsDecrementedOnTransactionException() + { + $pdo = $this->getMock('DatabaseConnectionTestMockPDO'); + $pdo->expects($this->once())->method('beginTransaction')->will($this->throwException(new ErrorException('MySQL server has gone away'))); + $connection = $this->getMockConnection([], $pdo); + $this->setExpectedException('ErrorException', 'MySQL server has gone away'); + $connection->beginTransaction(); + $connection->disconnect(); + $this->assertNull($connection->getPdo()); + } + + public function testCantSwapPDOWithOpenTransaction() + { + $pdo = $this->getMock('DatabaseConnectionTestMockPDO'); + $pdo->expects($this->once())->method('beginTransaction')->will($this->returnValue(true)); + $connection = $this->getMockConnection([], $pdo); + $connection->beginTransaction(); + $this->setExpectedException('RuntimeException', "Can't swap PDO instance while within transaction."); + $connection->disconnect(); + } + public function testBeganTransactionFiresEventsIfSet() { $pdo = $this->getMock('DatabaseConnectionTestMockPDO'); From f6f2712cc94471b9e01317ef988c2e68db3b56a2 Mon Sep 17 00:00:00 2001 From: Keith Kirk Date: Fri, 13 May 2016 12:54:16 -0700 Subject: [PATCH 3/3] Applies CS fix --- src/Illuminate/Database/Connection.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Illuminate/Database/Connection.php b/src/Illuminate/Database/Connection.php index 1bf681453f6..a319789fe80 100755 --- a/src/Illuminate/Database/Connection.php +++ b/src/Illuminate/Database/Connection.php @@ -507,7 +507,7 @@ public function beginTransaction() if ($this->transactions == 1) { try { $this->pdo->beginTransaction(); - } catch(Exception $e) { + } catch (Exception $e) { --$this->transactions; throw $e;