Mailinglisten-Archive |
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