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