phpbar.de logo

Mailinglisten-Archive

[php] PDO transaction state

[php] PDO transaction state

Martin Adler adler.martin at web.de
Die Okt 30 10:11:47 CET 2007


Guten Morgen,

ich wollte mal in diese Runde die Frage werfen, ob jemand schon mal 
Bedarf hatten über den Transaktionsstatus bescheid zu wissen und wie 
dies Problem gelößt wurde.

Z.B. folgendes Konsturkt:
Ein Objekt operiert auf einer Datenbank, ließt Werte aus und kann Werte 
zurück in die Datenbank schreiben.
Diesem Objekt können weitere Objekte übergeben werden, welche sich 
genauso verhalten, sprich sie lesen und schreiben ebenfalls für sich in 
die Datenbank.
Beim aufruf der Methode $obj->save() schreibt das Objekt nicht nur die 
neuen Werte in die DB sondern stellt auch sicher, dass die beherbergten 
Objekte dies auch tun, indem der Methodenaufruf an diese delegiert wird.

Eine Möglichkeit wäre, sich die Tatsache zu nutze zu machen, dass PDO 
eine Exception auslößt, wenn PDO->beginnTransaction() aufgerufen wärend 
einer bestehenden Transaktion aufgerufen wird. Einfach mit try-catch 
abfangen und "schlucken". Finde ich aber nicht wirklich schön...

Eine weitere Möglichkeit wäre die PDO Klasse zu erweitern.
Z.B.
class PDOe extends PDO {
	protected $_active_transaction = false;

	public function beginTransaction() {
		return $this->_active_transaction = parent::beginTransaction();
	}

	public function commit() {
		$this->_active_transaction = false;
		return parent::commit();
	}

	public function rollBack() {
		$this->_active_transaction = false;
		return parent::rollBack();
	}

	public function hasTransaction() {
		return $this->_active_transaction;
	}
}

Die Methode PDO->getAttribute(PDO::ATTR_AUTOCOMMIT) hilft auch nicht 
wirklich weiter, da z.B. Postgres dieses Attribut nicht kennt.

Eine Anfrage für eine solche Funktionalität gibt es bereits auch schon 
[1], nur scheinen die Entwickler es nicht sehr eilig mit der Umsetzung 
zu haben. Möglicherweise braucht man es auch nicht?
Wie macht ihr das?


[1] <http://pecl.php.net/bugs/bug.php?id=7718>

vielen Dank und grüße
Martin


php::bar PHP Wiki   -   Listenarchive