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/