From e0d55367154ae4f3fc30d0604277db4d20fa7478 Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Tue, 19 Jun 2018 16:17:43 +1200 Subject: [PATCH] API Support better transaction nesting --- code/PostgreSQLDatabase.php | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/code/PostgreSQLDatabase.php b/code/PostgreSQLDatabase.php index a0d1048..2f08b38 100644 --- a/code/PostgreSQLDatabase.php +++ b/code/PostgreSQLDatabase.php @@ -547,16 +547,31 @@ class PostgreSQLDatabase extends Database public function transactionRollback($savepoint = false) { + // Named savepoint if ($savepoint) { $this->query('ROLLBACK TO ' . $savepoint); - } else { - --$this->transactionNesting; - if ($this->transactionNesting > 0) { - $this->transactionRollback('NESTEDTRANSACTION' . $this->transactionNesting); - } else { - $this->query('ROLLBACK'); - } + return true; } + + // Abort if unable to unnest, otherwise jump up a level + if (!$this->transactionNesting) { + return false; + } + --$this->transactionNesting; + + // Rollback nested + if ($this->transactionNesting > 0) { + return $this->transactionRollback('NESTEDTRANSACTION' . $this->transactionNesting); + } + + // Rollback top level + $this->query('ROLLBACK'); + return true; + } + + public function transactionDepth() + { + return $this->transactionNesting; } public function transactionEnd($chain = false)