Forum

Moderiert von: stefan, spinne
Forum: Bug oder nicht...
Sie schreiben eine Antwort zum Thema: Transactions - driver-ibase.php
Gehe zu: OpenPHPNuke - das Open Source CMS Forum Index


Benutzername:
 
Sicherheits-Code
Sicherheits-Code
Neu laden

Thema im Überblick

Autor
stefan
Wohnort: Münster


Sende eine Private Nachricht an stefan
ICQ
Transactions - driver-ibase.php

Geschrieben: 01.05.2007 10:31

Vielen Dank für die unterstützung

änderung wurde in

Trunk rev. 756
Branch rev. 757

übernommen.


Zitieren Druckerfreundliche Darstellung nach oben
anonymous
Unregistrierter Benutzer
Transactions - driver-ibase.php

Geschrieben: 29.04.2007 23:10

anonymous schrieb am 29.04.2007 um 21:01:00 Uhr folgendes:



Wenn ibase_query unter PHP 5 bei update/insert/delete 0 anstatt false liefert kann man evtl. folgendes machen:

if ($docommit && (($ret === TRUE) || ($ret > 0))) {
ibase_commit ($this->_transactionID);
}

Sollte dann unter PHP 4 und 5 lauffähig sein.


das war exakt auch mein erster Versuch, funktionierte aber leider auch nicht so wie gewünscht.

Hab es jetzt mit is_resource($ret) == false gelöst.

Vollständig angepasstes driver-ibase.php hab ich Stefan gemailt.


Zitieren Druckerfreundliche Darstellung nach oben
anonymous
Unregistrierter Benutzer
Transactions - driver-ibase.php

Geschrieben: 29.04.2007 21:01

anonymous schrieb am 29.04.2007 um 14:51:25 Uhr folgendes:

Hi Stefan,

werd ich machen, aber will erst noch ein wenig austesten, bin nämlich noch auf ein weiteres Problem gestossen. Mit PHP 5 liefert ibase_query für ein UPDATE / INSERT / DELETE kein true mehr zurück sondern die Anzahl der manipulierten Datensätze.
Damit funktioniert

if ($docommit && $ret === TRUE) {
ibase_commit ($this->_transactionID);
}

nicht mehr.


Wenn ibase_query unter PHP 5 bei update/insert/delete 0 anstatt false liefert kann man evtl. folgendes machen:

if ($docommit && (($ret === TRUE) || ($ret > 0))) {
ibase_commit ($this->_transactionID);
}

Sollte dann unter PHP 4 und 5 lauffähig sein.


Zitieren Druckerfreundliche Darstellung nach oben
anonymous
Unregistrierter Benutzer
Transactions - driver-ibase.php

Geschrieben: 29.04.2007 14:51

Hi Stefan,

werd ich machen, aber will erst noch ein wenig austesten, bin nämlich noch auf ein weiteres Problem gestossen. Mit PHP 5 liefert ibase_query für ein UPDATE / INSERT / DELETE kein true mehr zurück sondern die Anzahl der manipulierten Datensätze.
Damit funktioniert

if ($docommit && $ret === TRUE) {
     ibase_commit ($this->_transactionID);
}

nicht mehr.

Verwende gerade etwas sehr hässliches:

if ($docommit && strtoupper(substr($sql,0,6)) != "SELECT") {
     ibase_commit ($this->_transactionID);
}

Funktionert - aber das will ich so nicht lassen....

Gruß
Alex


Zitieren Druckerfreundliche Darstellung nach oben
stefan
Wohnort: Münster


Sende eine Private Nachricht an stefan
ICQ
Transactions - driver-ibase.php

Geschrieben: 29.04.2007 14:12

ok fine wenn du die driver-ibase.php fertig optimiert hast kannst du mir die dann bitte senden dann kann ich die auch in den trunk/branch einspielen


Zitieren Druckerfreundliche Darstellung nach oben
anonymous
Unregistrierter Benutzer
Transactions - driver-ibase.php

Geschrieben: 29.04.2007 13:13

Ja, sicher, MySQL ist verbreiteter aber es war ja schon immer so dass nicht immer das Beste sich am stärksten verbreitet
Bei mir wird jedenfalls alles was irgendwie machbar ist mit Firebird betrieben, auch wenn ich dann in der Regel fast immer selber paar Dinge anpassen muss.

aber zurück zum Thema. bei mir läuft die aktuellste Firebirdversion 2.0.1

hab gestern driver-ibase.php wie oben genannt angepasst, und hab das gerade im Live-Test, die concurrent update deadlocks sind weg und Transaktionen werden korrekt verwendet (transaktion parameter teste ich gerade noch die Beste Kombination IBASE_READ + IBASE_WRITE + IBASE_COMMITED + IBASE_REC_VERSION könnte passen).

die concurrent deadlocks kamen vorallem bei den UPDATE last_seen und UPDATE counter Statements.

Gruß
Alexander


Zitieren Druckerfreundliche Darstellung nach oben
stefan
Wohnort: Münster


Sende eine Private Nachricht an stefan
ICQ
Transactions - driver-ibase.php

Geschrieben: 29.04.2007 11:35

Hallo, was für eine Überraschung da nutzt jemand Firebird als DB, lange her das, das jemand fragte

welche version nutzt du? 1.5.x oder die 2.x


Zitieren Druckerfreundliche Darstellung nach oben
anonymous
Unregistrierter Benutzer
Transactions - driver-ibase.php

Geschrieben: 29.04.2007 02:06

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


Zitieren Druckerfreundliche Darstellung nach oben