php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
  #1 (permalink)  
Alt 20-07-2009, 14:35
tim-gt
 Registrierter Benutzer
Links : Onlinestatus : tim-gt ist offline
Registriert seit: Jun 2009
Beiträge: 52
tim-gt befindet sich auf einem aufstrebenden Ast
Standard mysqli::commit() und ::rollback()

Ich verstehe folgendes Beispiel aus dem PHP-Manual nicht ganz:

PHP-Code:
  <?php
$mysqli 
= new mysqli("localhost""my_user""my_password""world");

/* check connection */
if (mysqli_connect_errno()) {
    
printf("Connect failed: %s\n"mysqli_connect_error());
    exit();
}

/* disable autocommit */
$mysqli->autocommit(FALSE);

$mysqli->query("CREATE TABLE myCity LIKE City");
$mysqli->query("ALTER TABLE myCity Type=InnoDB");
$mysqli->query("INSERT INTO myCity SELECT * FROM City LIMIT 50");

/* commit insert */
$mysqli->commit();

/* delete all rows */
$mysqli->query("DELETE FROM myCity");

if (
$result $mysqli->query("SELECT COUNT(*) FROM myCity")) {
    
$row $result->fetch_row();
    
printf("%d rows in table myCity.\n"$row[0]);
    
/* Free result */
    
$result->close();
}

/* Rollback */
$mysqli->rollback();

if (
$result $mysqli->query("SELECT COUNT(*) FROM myCity")) {
    
$row $result->fetch_row();
    
printf("%d rows in table myCity (after rollback).\n"$row[0]);
    
/* Free result */
    
$result->close();
}

/* Drop table myCity */
$mysqli->query("DROP TABLE myCity");

$mysqli->close();
?>
The above example will output:
0 rows in table myCity.
50 rows in table myCity (after rollback).

Zuerst wird ja mit ->autocommit(false) das automatische Ausführen von Queries ausgeschaltet, oder? Dann werden drei Query-Befehle spezifiziert, die danach mit ->commit() ausgeführt werden, richtig? Die nachfolgende Query "DELETE.." sollte dann aber doch nicht ausgeführt werden, weil ->autocommit ja noch auf false ist? Und dann sollte andererseits mit ->rollback() nicht die Delete-Aufforderung rückgängig gemacht werden, sondern die "CREATE TABLE"-Aufforderung, oder nicht?


</div> </div>
Mit Zitat antworten
  #2 (permalink)  
Alt 20-07-2009, 17:15
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von tim-gt Beitrag anzeigen
Zuerst wird ja mit ->autocommit(false) das automatische Ausführen von Queries ausgeschaltet, oder?
Es wird nicht mehr automatisch nach jeder abgesetzten Query committed, ja.

Zitat:
Dann werden drei Query-Befehle spezifiziert, die danach mit ->commit() ausgeführt werden, richtig?
Genau, die werden nicht automatisch und sofort ausgeführt, sobald sie per mysqli->query an die DB übergeben wurden, sondern erst mal "auf Halde gelegt" - und dann zumsammen in einer Transaktion abgearbeitet, sobald du mit commit die Anweisung dazu gibst.

Zitat:
Die nachfolgende Query "DELETE.." sollte dann aber doch nicht ausgeführt werden, weil ->autocommit ja noch auf false ist?
Ja, meinem Verständnis nach sollte es sich so verhalten.

Siehe auch http://www.php.net/manual/en/mysqli.commit.php#89976:
Zitat:
Please note that calling mysqli::commit() will NOT automatically set mysqli::autocommit() back to 'true'.

This means that any queries following mysqli::commit() will be rolled back when your script exits.


Zitat:
Und dann sollte andererseits mit ->rollback() nicht die Delete-Aufforderung rückgängig gemacht werden, sondern die "CREATE TABLE"-Aufforderung, oder nicht?
Puh, da bin ich gerade überfragt.

Aber ich sehe das auch so, dass da hinter das DELETE erst noch mal ein COMMIT hingehören müsste, damit das Script sich wie beschrieben verhält.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #3 (permalink)  
Alt 20-07-2009, 17:48
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von tim-gt Beitrag anzeigen
Und dann sollte andererseits mit ->rollback() nicht die Delete-Aufforderung rückgängig gemacht werden, sondern die "CREATE TABLE"-Aufforderung, oder nicht?
Ne, das create table-Statement ist bereits commited worden, d.h. danach wird eine neue Transaktion begonnen, du rollst also nur das Delete zurück. Ich war mir erst nicht ganz sicher ob das drop table überhaupt ausgeführt wird, wenn danach kein commit mehr folgt. Aber in den Usercomments zu autocommit habe ich den passenden Hinweis gefunden:

Zitat:
CREATE TABLE and CREATE DATABASE (and probably others) are always commited immediately and your transaction appears to terminate. Thus any commands before and after will be commited, even if a subsequent rollback is attempted.

If you are in the middle of a transaction and you call mysqli_close() it appears that you get the funcitonality of an implicit rollback.
Das heißt, eigentlich müsste das Löschen der Tabelle zurückgerollt werden, das Drop table wird aber wohl wie create table implizit die Transaktion abschicken.
Mit Zitat antworten
  #4 (permalink)  
Alt 21-07-2009, 09:03
tim-gt
 Registrierter Benutzer
Links : Onlinestatus : tim-gt ist offline
Registriert seit: Jun 2009
Beiträge: 52
tim-gt befindet sich auf einem aufstrebenden Ast
Standard

Aha, dann ist es so, dass auch bei autocommit(false) alle Queries einfach mal "ausgeführt" werden, aber einfach nicht definitiv? mysqli::commit würde dann das ganze in "Stein meisseln", und rollback würde es rückgängig machen?
Wäre autocommit(true), dann wäre der Gebrauch von commit und rollback sinnlos, da eben commit sowieso immer gleich befohlen würde?
Macht eigentlich noch Sinn... und gewisse Statements kann man dann wohl nicht mehr zurückrollen, wie eben Create oder Drop Table.
Mit Zitat antworten
  #5 (permalink)  
Alt 21-07-2009, 09:56
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von tim-gt Beitrag anzeigen
Aha, dann ist es so, dass auch bei autocommit(false) alle Queries einfach mal "ausgeführt" werden, aber einfach nicht definitiv?
Innerhalb deiner Transaktion werden diese ausgeführt, d.h. ein truncate table und ein nachträgliches select liefert keine Daten, nach einem Rollback ist die Tabelle aber dennoch nicht leer.

Zitat:
mysqli::commit würde dann das ganze in "Stein meisseln", und rollback würde es rückgängig machen?
Richtig.
Zitat:
Wäre autocommit(true), dann wäre der Gebrauch von commit und rollback sinnlos, da eben commit sowieso immer gleich befohlen würde?
Richtig.
Zitat:
Macht eigentlich noch Sinn... und gewisse Statements kann man dann wohl nicht mehr zurückrollen, wie eben Create oder Drop Table.
Richtig.
Mit Zitat antworten
  #6 (permalink)  
Alt 21-07-2009, 19:40
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von tim-gt Beitrag anzeigen
und gewisse Statements kann man dann wohl nicht mehr zurückrollen, wie eben Create oder Drop Table.
Transaktionen dienen dazu, einzelne Statements zusammenzufassen, die wenn eins davon schief ginge, die Konsistenz der Daten kompromitieren würden - Einfügen von Datensätzen über mehrere Tabellen hinweg, die Fremdschlüssel berühren, etc. Wenn dann auffällt, dass eins davon fehlerhaft war, rollt man alles zurück, und hat nach wie vor konsitente Daten.

CREATE oder DROP hingegen haben nichts mit Konsistenz zu tun; deshalb wäre da die Möglichkeit eines Roolback eher unsinnig, es soll schliesslich kein komplettes Backup ersetzen.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Transaction - rollback psysmo PHP Developer Forum 8 14-02-2008 13:27
MySQLi Probleme.. DaRpH PHP Developer Forum 4 15-10-2006 18:59
[MySQL 4.1] MySQLi Stonebreaker62 SQL / Datenbanken 0 27-11-2005 21:22
PHP und "svn commit" Norad PHP Developer Forum 0 15-09-2004 13:44
MySQL instert in mehrere Tabellen // Rollback? Xtreaft SQL / Datenbanken 6 17-04-2003 14:12

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 00:01 Uhr.