diff options
Diffstat (limited to 'app/php/db/DBTransaction.php')
-rw-r--r-- | app/php/db/DBTransaction.php | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/app/php/db/DBTransaction.php b/app/php/db/DBTransaction.php new file mode 100644 index 0000000..b176453 --- /dev/null +++ b/app/php/db/DBTransaction.php @@ -0,0 +1,53 @@ +<?php + +Prado::using('Application.db.DBConnection'); +Prado::using('System.Data.TDbTransaction'); + +class DBTransaction extends TDbTransaction { + + private $_nestedCount = 0; + private $_rolledBack = FALSE; + + public function beginNestedTransaction() { + if ($this->getActive()) { + $this->_nestedCount++; + } + } + + public function commit() { + if ($this->_rolledBack) { + $childTransaction = (bool)($this->_nestedCount); + $this->rollback(); + if (!$childTransaction) { + throw new TDbException('Nested transaction was rolled back, unable to commit.'); + } + } + else { + if ($this->_nestedCount) { + $this->_nestedCount--; + } + else { + parent::commit(); + } + } + } + + public function rollback() { + if (!$this->getActive()) { + $this->_nestedCount = 0; + return; + } + if ($this->_nestedCount) { + $this->_rolledBack = TRUE; + $this->_nestedCount--; + } + else { + parent::rollback(); + $this->_nestedCount = 0; + $this->_rolledBack = FALSE; + } + } + +} + +?> |