Merge pull request #83 from dhensby/pulls/2.0/nested-transactions

FIX Allow nested transactions
This commit is contained in:
Damian Mooyman 2018-02-09 09:50:46 +13:00 committed by GitHub
commit 2bbd73620d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -36,6 +36,11 @@ class PostgreSQLDatabase extends Database
*/ */
protected $schema; protected $schema;
/**
* @var bool
*/
protected $transactionNesting = 0;
/** /**
* Toggle if transactions are supported. Defaults to true. * Toggle if transactions are supported. Defaults to true.
* *
@ -519,6 +524,9 @@ class PostgreSQLDatabase extends Database
public function transactionStart($transaction_mode = false, $session_characteristics = false) public function transactionStart($transaction_mode = false, $session_characteristics = false)
{ {
if ($this->transactionNesting > 0) {
$this->transactionSavepoint('NESTEDTRANSACTION' . $this->transactionNesting);
} else {
$this->query('BEGIN;'); $this->query('BEGIN;');
if ($transaction_mode) { if ($transaction_mode) {
@ -529,6 +537,8 @@ class PostgreSQLDatabase extends Database
$this->query("SET SESSION CHARACTERISTICS AS TRANSACTION {$session_characteristics};"); $this->query("SET SESSION CHARACTERISTICS AS TRANSACTION {$session_characteristics};");
} }
} }
++$this->transactionNesting;
}
public function transactionSavepoint($savepoint) public function transactionSavepoint($savepoint)
{ {
@ -538,16 +548,25 @@ class PostgreSQLDatabase extends Database
public function transactionRollback($savepoint = false) public function transactionRollback($savepoint = false)
{ {
if ($savepoint) { if ($savepoint) {
$this->query("ROLLBACK TO {$savepoint};"); $this->query('ROLLBACK TO ' . $savepoint);
} else { } else {
$this->query('ROLLBACK;'); --$this->transactionNesting;
if ($this->transactionNesting > 0) {
$this->transactionRollback('NESTEDTRANSACTION' . $this->transactionNesting);
} else {
$this->query('ROLLBACK');
}
} }
} }
public function transactionEnd($chain = false) public function transactionEnd($chain = false)
{ {
--$this->transactionNesting;
if ($this->transactionNesting <= 0) {
$this->transactionNesting = 0;
$this->query('COMMIT;'); $this->query('COMMIT;');
} }
}
public function comparisonClause($field, $value, $exact = false, $negate = false, $caseSensitive = null, $parameterised = false) public function comparisonClause($field, $value, $exact = false, $negate = false, $caseSensitive = null, $parameterised = false)
{ {