StaticDatabase::statConnect($_SERVER);
// Rollbacks every DB usage (in case the test couldn't call tearDown)
StaticDatabase::statRollback();
+ // Rollback the first, outer transaction just 2 be sure
+ StaticDatabase::getGlobConnection()->rollBack();
// Start the first, outer transaction
StaticDatabase::getGlobConnection()->beginTransaction();
}
{
if($this->_transactionDepth <= 0 || !$this->hasSavepoint()) {
parent::beginTransaction();
- $this->_transactionDepth = $this->_transactionDepth < 0 ? 0 : $this->_transactionDepth;
+ $this->_transactionDepth = 0;
} else {
$this->exec("SAVEPOINT LEVEL{$this->_transactionDepth}");
}
*/
public function commit()
{
+ // We don't want to "really" commit something, so skip the most outer hierarchy
+ if ($this->_transactionDepth <= 1 && $this->hasSavepoint()) {
+ $this->_transactionDepth = $this->_transactionDepth <= 0 ? 0 : 1;
+ return true;
+ }
+
$this->_transactionDepth--;
- if($this->_transactionDepth <= 0 || !$this->hasSavepoint()) {
- parent::commit();
- $this->_transactionDepth = $this->_transactionDepth < 0 ? 0 : $this->_transactionDepth;
- } else {
- $this->exec("RELEASE SAVEPOINT LEVEL{$this->_transactionDepth}");
- }
+ $this->exec("RELEASE SAVEPOINT LEVEL{$this->_transactionDepth}");
}
/**
*/
public function rollBack()
{
- if ($this->_transactionDepth <= 0) {
- throw new PDOException('Rollback error : There is no transaction started');
- }
-
$this->_transactionDepth--;
- if($this->_transactionDepth == 0 || !$this->hasSavepoint()) {
- parent::rollBack();
+ if($this->_transactionDepth <= 0 || !$this->hasSavepoint()) {
+ $this->_transactionDepth = 0;
+ try {
+ parent::rollBack();
+ } catch (PDOException $e) {
+ // this shouldn't happen, but it does ...
+ }
} else {
$this->exec("ROLLBACK TO SAVEPOINT LEVEL{$this->_transactionDepth}");
}
*/
private static $staticConnection;
+ /** @var bool */
+ private $_locked = false;
+
/**
* Override the behaviour of connect, due there is just one, static connection at all
*
return true;
}
+ /** Mock for locking tables */
+ public function lock($table)
+ {
+ if ($this->_locked) {
+ return false;
+ }
+
+ $this->in_transaction = true;
+ $this->_locked = true;
+
+ return true;
+ }
+
+ /** Mock for unlocking tables */
+ public function unlock()
+ {
+ // See here: https://dev.mysql.com/doc/refman/5.7/en/lock-tables-and-transactions.html
+ $this->performCommit();
+
+ $this->in_transaction = false;
+ $this->_locked = false;
+
+ return true;
+ }
+
/**
* Does a commit
*
return self::$staticConnection;
}
- /**
- * Perform a global commit for every nested transaction of the static connection
- */
- public static function statCommit()
- {
- if (isset(self::$staticConnection)) {
- while (self::$staticConnection->getTransactionDepth() > 0) {
- self::$staticConnection->commit();
- }
- }
- }
-
/**
* Perform a global rollback for every nested transaction of the static connection
*/