Skip to content

Commit

Permalink
FIX Allow nested transactions
Browse files Browse the repository at this point in the history
  • Loading branch information
dhensby committed Feb 8, 2018
1 parent 1f6d892 commit 97afbd9
Showing 1 changed file with 28 additions and 9 deletions.
37 changes: 28 additions & 9 deletions code/PostgreSQLDatabase.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,11 @@ class PostgreSQLDatabase extends Database
*/
protected $schema;

/**
* @var bool
*/
protected $transactionNesting = 0;

/**
* Toggle if transactions are supported. Defaults to true.
*
Expand Down Expand Up @@ -519,15 +524,20 @@ public function supportsExtensions($extensions = array('partitions', 'tablespace

public function transactionStart($transaction_mode = false, $session_characteristics = false)
{
$this->query('BEGIN;');
if ($this->transactionNesting > 0) {
$this->transactionSavepoint('NESTEDTRANSACTION' . $this->transactionNesting);
} else {
$this->query('BEGIN;');

if ($transaction_mode) {
$this->query("SET TRANSACTION {$transaction_mode};");
}
if ($transaction_mode) {
$this->query("SET TRANSACTION {$transaction_mode};");
}

if ($session_characteristics) {
$this->query("SET SESSION CHARACTERISTICS AS TRANSACTION {$session_characteristics};");
if ($session_characteristics) {
$this->query("SET SESSION CHARACTERISTICS AS TRANSACTION {$session_characteristics};");
}
}
++$this->transactionNesting;
}

public function transactionSavepoint($savepoint)
Expand All @@ -538,15 +548,24 @@ public function transactionSavepoint($savepoint)
public function transactionRollback($savepoint = false)
{
if ($savepoint) {
$this->query("ROLLBACK TO {$savepoint};");
$this->query('ROLLBACK TO ' . $savepoint);
} else {
$this->query('ROLLBACK;');
--$this->transactionNesting;
if ($this->transactionNesting > 0) {
$this->transactionRollback('NESTEDTRANSACTION' . $this->transactionNesting);
} else {
$this->query('ROLLBACK');
}
}
}

public function transactionEnd($chain = false)
{
$this->query('COMMIT;');
--$this->transactionNesting;
if ($this->transactionNesting <= 0) {
$this->transactionNesting = 0;
$this->query('COMMIT;');
}
}

public function comparisonClause($field, $value, $exact = false, $negate = false, $caseSensitive = null, $parameterised = false)
Expand Down

0 comments on commit 97afbd9

Please sign in to comment.