mirror of
https://github.com/silverstripe/silverstripe-postgresql
synced 2024-10-22 17:05:45 +02:00
FIX Allow nested transactions
This commit is contained in:
parent
1f6d892609
commit
97afbd9a88
@ -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,15 +524,20 @@ class PostgreSQLDatabase extends Database
|
|||||||
|
|
||||||
public function transactionStart($transaction_mode = false, $session_characteristics = false)
|
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) {
|
if ($transaction_mode) {
|
||||||
$this->query("SET TRANSACTION {$transaction_mode};");
|
$this->query("SET TRANSACTION {$transaction_mode};");
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($session_characteristics) {
|
if ($session_characteristics) {
|
||||||
$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,15 +548,24 @@ 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->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)
|
public function comparisonClause($field, $value, $exact = false, $negate = false, $caseSensitive = null, $parameterised = false)
|
||||||
|
Loading…
Reference in New Issue
Block a user