Autor | Gast |
Datum | 29.04.2007 02:06 |
Beiträge: | Hallo,
ich wollte Transaktionen aktivieren für meine OPN Installation mit Firebird als DB - Backend da ich oft deadlocks durch concurrent updates hatte. Nachdem ich in driver-ibase.php geschaut habe, wundere ich mich über folgende Punkte: 1. Eine Transaktion wird in RowLock() gestartet, aber diese Funktion wird niergends im restlichen Code aufgerufen, es ist eine tote / unbenutzte Funktion !? 2. in _query() kann ich sehen, dass Transactions nur genutzt werden wenn autoCommit false ist und _transactionID definiert ist -> problem: transactionID wird nur in BeginTrans() gesetzt, diese Funktion wird von RowLock() aus aufgerufen, aber RowLock() selber wird niergends aufgerufen (siehe 1.) => _query() benutzt niemanls Transaktionen !? 3. in _query() muss autoCommit false sein damit Transaktionen genutzte werden aber in RowLock() muss autoCommit hingegen true sein damit BeginTransaction aufgerufend wird und eine TransaktionID für _query angefordert wird -> diese beiden Bedingungen stehn in Konflikt zueinander !? 4. Am Ende von _query wird ibase_commit aufgerufen wenn docommit true ist, aber am Anfang von _query wird docommit im Transactions-IF auf false gesetzt und im Nicht-Transaktions-IF auf true => commit wird aufgerufen wenn gar keine Transaktion verwendet wird und im transaktions-fall würde kein Commit gemacht werden -> müsse genau umgekehrt sein 5. das commit erfolgt auf die ConnectionID, müsste aber auf die transactionID erfolgen. => _query müsste geändert werden auf: function _query ($sql, $inputarr = false) { if (!$this->autoCommit) { $this->BeginTrans(); $conn = $this->_transactionID; $docommit = true; } else { $conn = $this->_connectionID; $docommit = false; } .... if ($docommit && $ret === true) { ibase_commit ($this->_transactionID); } $this->_thissql = $sql; return $ret; => UpdateBlob müsste geändert werden auf function UpdateBlob ($table, $column, $val, $where, $blobtype = 'BLOB') { $this->BeginTrans(); ... $blob_id_str = ibase_blob_close ($blob_id); $ret = ibase_query('UPDATE ' . $table . ' SET ' . $column . '=(?) WHERE ' . $where,$blob_id_str); ibase_commit ($this->_transactionID); return $ret; Wenn ich irgendwas falsche sehe wäre es klasse wenn mich jemand wieder auf die richtige Fährte bringt. Gruß Alexander P.S. nein, ich will kein MySQL verwenden |
Diese Seite drucken Diese Seite schließen |
Dieser Artikel kommt von: OpenPHPNuke - das Open Source CMS |
http://www.openphpnuke.info/ |