Timeout - Datenbank inkonsistent?
Kalle_B
- php
Hallöle,
habe einen Simulations- und Buchungslauf, der lange dauern kann, 15 Minuten vielleicht.
Wie ist es eigentlich, wenn PHP mit Timeout abbricht - ist das an definierten Stellen im Programm? Etwa am Ende einer Schleife?
Es könnte doch sein, dass ein Teil von zusammengehörigen Buchungen noch gemacht wird, der Rest aber nicht?
Frage nur mal vorsichtshalber, um solche DB- Fehler bei der Fehlersuche in Betracht zu ziehen.
Bei meinem PHP 3.0.18 kann ich die Laufzeit wohl nicht durch Einstellung im Programm verlängern?
Ob ich an die php.ini drankomme, weiss ich nicht, wo müsste ich die im UNIX-System suchen? Habe nur FTP- Rechte.
LG Kalle
Hi,
der Abbruch dürfte eher unkontrolliert erfolgen. Wie deine Datenbank darauf reagiert kommt sehr auf die Einstellungen an. Ich habe bei den MySQL-Funktionen gerade den Vorschlag gefunden die Transaktionen zur Datenbank manuell zu starten und zu beenden, also
mysql_query("BEGIN");
...
mysql_query("COMMIT");
Das müsste dafür sorgen, dass alles zwischen den beiden Befehlen nur dann wirksam wird wenn der zweite Befehl ausgeführt wurde, bei vorzeitigem Abbruch werden die Änderungen zurückgenommen. Allerdings, wenn dein Skript so lange läuft stellt sich automatisch auch die Frage, ob das Transaktionsprotokoll dafür ausreichen würde alle diese Änderungen auf einmal aufzunehmen!
Von mindestens einer anderen Skriptsprachen kenne ich darüber hinaus noch das Grundsatzverhalten das Skript als ganzes als Transaktion anzusehen und Änderungen an der Datenbank nur dann dauerhaft zu übernehmen wenn das Skript erfolgreich terminiert.
MfG
Rouven
Hi,
mysql_query("BEGIN");
...
mysql_query("COMMIT");
Das wäre eine saubere Lösung, aber ob meine alte MySQL- Version 3.23.58 das mitmacht?
Werde ich gleich testen, kenne das aus uralten Zeiten (1998) von Oracle. Das Verwerfen müsste dann logischerweise ROLLBACK heißen?
Falls du eine Quelle zum Nachlesen hast, bitte posten.
Bin jetzt einem Problem auf der Spur, wo Datensätze verloren gingen. Inzwischen haben mehrere Leute Zugriff auf das Projekt und könnten auch von zuhause löschen.
Nicht aus Boshaftigkeit, aber vielleicht mal dem Bruder gezeigt, was man den ganzen Tag im Büro macht. Dann Kaffee geholt und Bruder klickt mal eben, um zu sehen, was passiert ...
Gruß von Detektiv Kalle
Hi,
Werde ich gleich testen, kenne das aus uralten Zeiten (1998) von Oracle. Das Verwerfen müsste dann logischerweise ROLLBACK heißen?
ja, müsste es, aber die Frage wäre ja wozu du das brauchst, es sei denn du willst den Vorgang explizit abbrechen. Eine Transaktion müsste automatisch verworfen werden sofern sie nicht COMMITED wurde (...und der Verantwortliche, also das Skript, sich aus dem Staub gemacht hat).
Falls du eine Quelle zum Nachlesen hast, bitte posten.
Hmh, also zunächst mal steht hier, dass MySQL per Default auf AutoCommit arbeitet, das müsste man ihm auf jeden Fall abgewöhnen, denn sonst ist jedes Statement für sich doch wieder permanent. Das kann man offenbar mit SET AUTOCOMMIT ändern.
Ansonsten blättere mal da durchs nähere Umland, wenn irgendwo was steht dann wohl da, ausgenommen es gäbe PHP-Besonderheiten.
MfG
Rouven
Hi,
Werde ich gleich testen, kenne das aus uralten Zeiten (1998) von Oracle. Das Verwerfen müsste dann logischerweise ROLLBACK heißen?
ja, müsste es, aber die Frage wäre ja wozu du das brauchst, es sei denn du willst den Vorgang explizit abbrechen. Eine Transaktion müsste automatisch verworfen werden sofern sie nicht COMMITED wurde (...und der Verantwortliche, also das Skript, sich aus dem Staub gemacht hat).
Aber die VOR dem COMMIT gemachten Änderungen stehen dem lfd. Skript schon zur Verfügung, aber anderen Scripten nicht?
Das wäre in Ordnung, dann können andere Scripte nicht mitverfolgen, wie sich Daten ändern. War bisher eine nette Zugabe.
Werde mich mal in deinen Quellen umschauen.
Danke
LG Kalle
Hi,
Aber die VOR dem COMMIT gemachten Änderungen stehen dem lfd. Skript schon zur Verfügung, aber anderen Scripten nicht?
ui, da bin ich überfragt. Innerhalb der selben Transaktion sollten sie eigentlich. Nach außen hängt das vom gewählten Isolation-Level ab, wobei das für dich nicht in Frage kommt (Unterstützung erst ab 4.irgendwas).
MfG
Rouven
Moin!
Das wäre eine saubere Lösung, aber ob meine alte MySQL- Version 3.23.58 das mitmacht?
Nein.
Abgesehen davon halte ich es für ungünstig, eine gesamte, 15 Minuten andauernde Operation in nur eine einzige Transaktion zu packen. Das geht doch sicher auch kleinteiliger.
Allerdings: In MySQL 3 hast du keine Transaktionen, du bist also immer in der Gefahr, dass parallele Zugriffe inkonsistent werden. Angenommen, ein INSERT benötigt ein vorheriges SELECT. Und direkt nach diesem SELECT ändert ein anderer Prozess den gelesenen Datensatz, so dass das INSERT mit alten Daten arbeitet und falsche Werte schreibt (in Bezug auf den gelesenen und zwischenzeitlich geänderten Datensatz).
Du kannst natürlich ganze Tabellen gegen Bearbeitung sperren - dann ist aber für alle anderen Zugriffe eine Zeit lang Arbeitspause angesagt.
Bin jetzt einem Problem auf der Spur, wo Datensätze verloren gingen. Inzwischen haben mehrere Leute Zugriff auf das Projekt und könnten auch von zuhause löschen.
"Löschen" von Datensätzen ist sowieso immer böse, sowas vermeidet man grundsätzlich. Man kennzeichnet einen Datensatz höchstens als gelöscht, beläßt ihn aber immer in der DB. Jedenfalls dann, wenn ein normaler Benutzer an der DB arbeitet. Denn es passiert einfach zu schnell, dass aus Versehen gelöscht wurde - und wenn dann alles weg ist, und neu eingegeben werden muß, ist das blöd. Stattdessen einfach ein Lösch-Flag zurückzusetzen ist dagegen viel einfacher.
- Sven Rautenberg
echo $begrüßung;
Ich habe bei den MySQL-Funktionen gerade den Vorschlag gefunden die Transaktionen zur Datenbank manuell zu starten und zu beenden, also
mysql_query("BEGIN");
...
mysql_query("COMMIT");
Dabei ist zu beachten, dass Transaktionen nicht von der Standard-Storage-Engine MyISAM unterstützt werden sondern nur von der InnoDB und von BDB. Beide müssten laut Handbuch in der verwendeten Version 3.23.58 prinzipiell verfügbar sein. Ob sie der Provider auch aktiviert hat, ...
echo "$verabschiedung $name";
Hallöle Kalle_B,
habe einen Simulations- und Buchungslauf, der lange dauern kann, 15 Minuten vielleicht.
Die Time-Limit-Einstellung von PHP bezieht sich nur auf die durch das Script verbrauchte CPU-Zeit (siehe PHP-Handbuch zu set_time_limit() ).
Wie ist es eigentlich, wenn PHP mit Timeout abbricht - ist das an definierten Stellen im Programm? Etwa am Ende einer Schleife?
http://www.php.net/manual/de/features.connection-handling.php
Bei meinem PHP 3.0.18 kann ich die Laufzeit wohl nicht durch Einstellung im Programm verlängern?
set_time_limit() gibts seit PHP 3.0.7 -- seine Funktion hängt aber von verschiedenen Einstellungen in der php.ini ab.
Ob ich an die php.ini drankomme, weiss ich nicht, wo müsste ich die im UNIX-System suchen?
http://www.php.net/manual/de/install.unix.php
Habe nur FTP- Rechte.
Dann ist es eher unwahrscheinlich, dass du die php.ini (oder bei dir php3.ini) ändern kannst.
MffG
EisFuX