php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 20.07.2007, 09:37  
there's only one psycho
 
Benutzerbild von PsychoEagle
 
Registriert seit: 21.08.2007
Beiträge: 1.283
PHP-Kenntnisse:
Anfänger
PsychoEagle ist ein sehr geschätzer MenschPsychoEagle ist ein sehr geschätzer MenschPsychoEagle ist ein sehr geschätzer Mensch
PsychoEagle eine Nachricht über ICQ schicken PsychoEagle eine Nachricht über Skype™ schicken
Standard Transaktion(en) mit der InnoDB-Engine, aber wie?!

Tach ihr,

ich schon wieder und wie gedroht komm ich nun mit meiner ersten Frage in Sachen InnoDB und Transaktionen

Ich habe schon so ziemlich überall geschaut (Google, dev.mysql.com, Forumssuche, ...), aber irgendwie komm ich bei meinem Test nicht weiter und blicke glaub noch nicht wirklich in der Sache durch.

Links die ich fand, weitergeholfen haben, aber irgendwo doch nicht:
[url=http://www.phpfriend.de/forum/viewtopic.php?t=20669&highlight=innodb+transaktion] Beitrag in diesem Forum
[url=http://groups.google.com/group/de.comp.datenbanken.mysql/browse_thread/thread/f0311b4edf60eabf] Anderes Forum: Transaktionen, aber wie?

Vielleicht könnt ihr mir weiter helfen, ich habe 3 Tabellen die wie folgt aussehen:

Code:
-- 
-- Tabellenstruktur für Tabelle `user_data`
-- 

CREATE TABLE `user_data` (
  `userid` int(11) NOT NULL,
  `ugender` char(1) NOT NULL,
  `uforename` varchar(100) NOT NULL,
  `usurname` varchar(100) NOT NULL,
  `ubirthday` varchar(20) NOT NULL,
  `ufamstatus` int(11) default NULL,
  `ujob` varchar(50) default NULL,
  `ucity` varchar(80) default NULL,
  `ucountry` varchar(2) NOT NULL,
  `usmoker` tinyint(1) default NULL,
  `uicq` varchar(15) default NULL,
  `umsn` varchar(80) default NULL,
  `uskype` varchar(50) default NULL,
  `uwebsite` varchar(150) default NULL,
  UNIQUE KEY `userid` (`userid`)
) TYPE=InnoDB;

-- 
-- Tabellenstruktur für Tabelle `user_general`
-- 

CREATE TABLE `user_general` (
  `userid` int(11) NOT NULL,
  `uemail` varchar(80) NOT NULL,
  `unick` varchar(100) NOT NULL,
  `upassword` varchar(32) NOT NULL,
  `stateid` int(11) NOT NULL,
  `uregdate` varchar(20) NOT NULL,
  `ulastip` varchar(15) NOT NULL,
  `uverified` tinyint(1) default NULL,
  `ucode` varchar(10) default NULL,
  PRIMARY KEY  (`userid`),
  UNIQUE KEY `unick` (`unick`)
) TYPE=InnoDB AUTO_INCREMENT=1 ;

-- 
-- Tabellenstruktur für Tabelle `user_statistik`
-- 

CREATE TABLE `user_statistik` (
  `userid` int(11) NOT NULL,
  `uvisits` int(11) NOT NULL default '0',
  `ulogins` int(11) NOT NULL default '0',
  `ulastlogin` int(11) default NULL,
  `usetnews` int(11) NOT NULL default '0',
  `usetgbook` int(11) NOT NULL default '0',
  `usetcomment` int(11) NOT NULL default '0',
  `usetpm` int(11) NOT NULL default '0',
  `ugetpm` int(11) NOT NULL default '0',
  PRIMARY KEY  (`userid`)
) TYPE=InnoDB;
Desweiteren möchte ich nun eine Transaktion ausführen, die mir meine Einträge macht (=COMMIT) oder eben nicht bei Fehler (=ROLLBACK).

PHP-Code:
<?php
  $sql 
"START TRANSACTION;
          INSERT INTO user_general(uemail,unick,upassword,stateid,uregdate,ulastip,uverified,ucode) 
                      VALUES ('xyz@onlinehome.de','A-Jim',MD5(test),'1','1172056156','172.0.0.1','1','DE5QS');
          INSERT INTO user_data(userid,ugender,uforename,usurname,ubirthday,ucountry) 
                      VALUES (LAST_INSERT_ID(),'m','-','-','515541600','de');
          INSERT INTO user_statistik(userid) 
                      VALUES (LAST_INSERT_ID());
          COMMIT;"
;
  
mysql_query($sql) OR print(mysql_error());
?>
Soweit so gut, aber wieso funktioniert das nicht, bzw was mach ich falsch? steig noch nicht ganz durch, sorry.

Fehler:
Code:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '; INSERT INTO user_general(uemail,unick,upassword,stateid,uregdate,ul' at line 1
Danke für Hilfe und Aufklärung,

Grüße
Da Psy
__________________
"Weaseling out of things is important to learn. It's what separates us from the animals ... except the weasel." (Homer J. Simpson)
PsychoEagle ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 20.07.2007, 09:39  
there's only one psycho
 
Benutzerbild von PsychoEagle
 
Registriert seit: 21.08.2007
Beiträge: 1.283
PHP-Kenntnisse:
Anfänger
PsychoEagle ist ein sehr geschätzer MenschPsychoEagle ist ein sehr geschätzer MenschPsychoEagle ist ein sehr geschätzer Mensch
PsychoEagle eine Nachricht über ICQ schicken PsychoEagle eine Nachricht über Skype™ schicken
Standard

Oh, da fällt mir gerade auf, dass mehrere SQLs in einem Query gar nicht funktionieren oder? Muss ich dann dementsprechend mehrere Qrys durchführen? (habs auch getestet ohne Fehler)

Sprich:
PHP-Code:
<?php
  
/* Transaktion starten */
  
$sql "START TRANSACTION;";
  
mysql_query($sql) OR print(mysql_error());
  
  
/* Eintrag in Allgemeine Tabelle der User */
  
$sql "INSERT INTO user_general(uemail,unick,upassword,stateid,uregdate,ulastip,uverified,ucode) 
                      VALUES ('xyz@onlinehome.de','A-Jim',MD5('test'),'1','1172056156','172.0.0.1','1','DE5QS');"
;
  
mysql_query($sql) OR print(mysql_error());
  
  
/* Eintrag in Daten Tabelle der User */
  
$sql "INSERT INTO user_data(userid,ugender,uforename,usurname,ubirthday,ucountry) 
                      VALUES (LAST_INSERT_ID(),'m','-','-','515541600','de');"
;
  
mysql_query($sql) OR print(mysql_error());
  
  
/* Eintrag in Statistiken Tabelle der User */
  
$sql "INSERT INTO user_statistik(userid) 
                      VALUES (LAST_INSERT_ID());"
;
  
mysql_query($sql) OR print(mysql_error());
  
  
/* Ausführen der Querys */
  //$sql = "COMMIT;";
  //mysql_query($sql) OR print(mysql_error());
?>
zumindestens kommt kein Fehler. Möchte nur durchblicken

Und wenn er bei COMMIT nicht angelangt (kann ich ja mal testen und auskommentieren diesen Query), dann macht er das Rollback (bzw trägt nichts ein und die Datenbank ist wie davor)?

Oder hab ich das falsch verstanden.

Zumindestens macht er das so, und wenn ich COMMIT nicht auskommentiere, trägt er soweit alles ein (wie es aussieht).

Grüße

Da Psy
__________________
"Weaseling out of things is important to learn. It's what separates us from the animals ... except the weasel." (Homer J. Simpson)
PsychoEagle ist offline   Mit Zitat antworten
Alt 20.07.2007, 10:33  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Wäre ja fatal, wenn ein Nicht-senden eines COMMITs am Ende einen COMMIT auslösen würde.
Auf jeden Fall solltest du trotzdem sicherstellen, dass der COMMIT / ROLLBACK gesendet wird, sonst kann es sein, dass deine Datenbank je nach Isolationslevel gesperrt ist und es auch bleibt (bis MySQL bemerkt, dass hier ein Schusel am Werk ist).

Übrigens ist deine Transaktion ziemlich sinnlos, denn bei Fehlern werden die Queries trotzdem alle durchlaufen. Du musst dein Skript schon so schachteln, dass es bei einem Fehler den ROLLBACK anstösst und NICHT noch an den anderen Queries "vorbeikommt".
Zergling-new ist offline   Mit Zitat antworten
Alt 20.07.2007, 11:04  
there's only one psycho
 
Benutzerbild von PsychoEagle
 
Registriert seit: 21.08.2007
Beiträge: 1.283
PHP-Kenntnisse:
Anfänger
PsychoEagle ist ein sehr geschätzer MenschPsychoEagle ist ein sehr geschätzer MenschPsychoEagle ist ein sehr geschätzer Mensch
PsychoEagle eine Nachricht über ICQ schicken PsychoEagle eine Nachricht über Skype™ schicken
Standard

Zitat:
Zitat von Zergling
Übrigens ist deine Transaktion ziemlich sinnlos, denn bei Fehlern werden die Queries trotzdem alle durchlaufen. Du musst dein Skript schon so schachteln, dass es bei einem Fehler den ROLLBACK anstösst und NICHT noch an den anderen Queries "vorbeikommt".
Hmm ... wäre es so dann "besser"?

PHP-Code:
<?php
  
/* Transaktion starten */
  
$sql_err '';
  
$sql "START TRANSACTION;";
  
mysql_query($sql);
  
  
/* Eintrag in Allgemeine Tabelle der User */
  
if($sql_err == '') {
    
$sql "INSERT INTO user_general(uemail,unick,upassword,stateid,uregdate,ulastip,uverified,ucode) 
                        VALUES ('xyz@onlinehome.de','A-Jim2',MD5('test'),'1','1172056156','172.0.0.1','1','DE5QS');"
;
    
mysql_query($sql) OR $sql_err .= '[b]user_general:[/b] 'mysql_error() .'
'
;
  }
  
  
/* Eintrag in Daten Tabelle der User */
  
if($sql_err == '') {
    
$sql "INSERT INTO user_data(userid,ugender,uforename,usurname,ubirthday,ucountry) 
                        VALUES (LAST_INSERT_ID(),'m','-','-','515541600','de');"
;
    
mysql_query($sql) OR $sql_err .= '[b]user_data:[/b] 'mysql_error() .'
'
;
  }
  
  
/* Eintrag in Statistiken Tabelle der User */
  
if($sql_err == '') {
    
$sql "INSERT INTO user_statistik(userid) 
                        VALUES (LAST_INSERT_ID());"
;
    
mysql_query($sql) OR $sql_err .= '[b]user_statistik:[/b] 'mysql_error() .'
'
;
  }
  
  
/* COMMIT oder ROLLBACK */
  
if($sql_err == '') {
    
$sql "COMMIT;";
  } else {
    
$sql "ROLLBACK;";
  }
  
mysql_query($sql);
  
  
/* Ausgabe SQL-Errors */
  
if($sql_err != '') {
      echo 
$sql_err;
      
$sql_err '';
  }
?>
Ganz steig ich noch nicht durch, denn wenn ein Fehler in sagen wir mal dem 2ten Query vorkommt, wird der 1. und 3. SQL-Befehl nicht durchgeführt und es wird kein Eintrag vorgenommen (bzw es wird zurück gesetzt), wie ich es ja auch will.

Jedoch wird der auto_increment nicht zurückgesetzt und bleibt um 1 erhöht, auch wenn kein Eintrag stattfand.

Danke schon mal Zergling :wink:
__________________
"Weaseling out of things is important to learn. It's what separates us from the animals ... except the weasel." (Homer J. Simpson)
PsychoEagle ist offline   Mit Zitat antworten
Alt 20.07.2007, 14:00  
Moderator
 
Benutzerbild von agrajag
 
Registriert seit: 02.10.2006
Beiträge: 3.820
PHP-Kenntnisse:
Fortgeschritten
agrajag wird schon bald berühmt werdenagrajag wird schon bald berühmt werden
Standard

Zitat:
Zitat von PsychoEagle
[...]Jedoch wird der auto_increment nicht zurückgesetzt und bleibt um 1 erhöht, auch wenn kein Eintrag stattfand.
Wenn ich da MySQL-Manual dazu richtig verstehe ist das, das normale verhalten.

Ist ja auch irgendwie nachvollziehbar:
Nehmen wir an 2 Transaktionen fügen gleichzeitig Datensätze in die Tabelle ein und bekommen durch auto_increment Werte zugwiesen - machst du jetzt ein rollback auf die 1. Transaktion müsste ja ansonsten die ID der 2. Transaktion auch zurückgesetzt werden...
__________________
Today you...Tomorrow me.
agrajag ist offline   Mit Zitat antworten
Alt 20.07.2007, 15:04  
there's only one psycho
 
Benutzerbild von PsychoEagle
 
Registriert seit: 21.08.2007
Beiträge: 1.283
PHP-Kenntnisse:
Anfänger
PsychoEagle ist ein sehr geschätzer MenschPsychoEagle ist ein sehr geschätzer MenschPsychoEagle ist ein sehr geschätzer Mensch
PsychoEagle eine Nachricht über ICQ schicken PsychoEagle eine Nachricht über Skype™ schicken
Standard

Wozu brauch ich das ganze dann genau? Ich könnt doch theoretisch einfach wieder alle Einträge löschen, bei denen die ID soundso ist.

PHP-Code:
<?php
  
// Tabelle 1
  
$sql "INSERT INTO tabelle1(...) VALUES (...)";
  
mysql_query($sql) OR $err true;
  
// User ID
  
$userid mysql_insert_id();
  
// Tabelle 2
  
$sql "INSERT INTO tabelle2(...) VALUES (...)";
  
mysql_query($sql) OR $err true;
  
// Tabelle 3
  
$sql "INSERT INTO tabelle3(...) VALUES (...)";
  
mysql_query($sql) OR $err true;

  if(isset(
$err) AND $err == true) {
    
$sql "DELETE FROM tabelle 1 WHERE userid = $userid";
    
mysql_query($sql);
    
$sql "DELETE FROM tabelle 2 WHERE userid = $userid";
    
mysql_query($sql);
    
$sql "DELETE FROM tabelle 3 WHERE userid = $userid";
    
mysql_query($sql);
    
// Ausgabe Info
    
echo 'Fehler';
  } else {
    
// Ausgabe Info
    
echo 'Eingetragen';
  }
?>
Ist doch dann vom Prinzip das selbe, nur schneller das InnoDB von der Performance nicht so schnell ist wie MyISAM (laut Forenbeiträgen die ich fand).

Grüße
Da Psy
__________________
"Weaseling out of things is important to learn. It's what separates us from the animals ... except the weasel." (Homer J. Simpson)
PsychoEagle ist offline   Mit Zitat antworten
Alt 20.07.2007, 15:23  
Moderator
 
Benutzerbild von agrajag
 
Registriert seit: 02.10.2006
Beiträge: 3.820
PHP-Kenntnisse:
Fortgeschritten
agrajag wird schon bald berühmt werdenagrajag wird schon bald berühmt werden
Standard

Zitat:
Zitat von PsychoEagle
Wozu brauch ich das ganze dann genau? Ich könnt doch theoretisch einfach wieder alle Einträge löschen, bei denen die ID soundso ist.
Und wer garantiert dir, dass es nicht auch bei den Lösch-Querys zu einem Fehler kommt? Das kann dir mit Transaktionen nicht passieren.

Außerdem musst du es mit Transaktionen auch nicht alles von Hand ausprogrammieren....


Das InnoDB langsamer ist könnte vielleicht sein - aber das wird sich wohl erst bei wirklich großen Projekten auswirken... und wahrscheinlich auch nur dann wenn du wirklich Constraints anlegst die dann geprüft werden müssen (Foreign keys ...).
__________________
Today you...Tomorrow me.
agrajag ist offline   Mit Zitat antworten
Alt 21.07.2007, 13:18  
there's only one psycho
 
Benutzerbild von PsychoEagle
 
Registriert seit: 21.08.2007
Beiträge: 1.283
PHP-Kenntnisse:
Anfänger
PsychoEagle ist ein sehr geschätzer MenschPsychoEagle ist ein sehr geschätzer MenschPsychoEagle ist ein sehr geschätzer Mensch
PsychoEagle eine Nachricht über ICQ schicken PsychoEagle eine Nachricht über Skype™ schicken
Standard

Vielen Dank, dann bleib ich bei den Transaktionen Hast mir sehr geholfen, dort ein wenig mehr durchzublicken.

Wäre der Quellcode logisch dann richtig (der oben mit Transaktionen von mir) oder ist der eher zu umständlich und es geht einfacher? Hättest du mir da ein Beispiel?

Grüße
Da Psy
__________________
"Weaseling out of things is important to learn. It's what separates us from the animals ... except the weasel." (Homer J. Simpson)
PsychoEagle ist offline   Mit Zitat antworten
Alt 21.07.2007, 14:20  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Warum speicherst du die Sachen denn überhaupt in verschiedenen Tabellen?
Ob das umständlich ist musst du selbst wissen, vielleicht kannst du dir ja eine Transaktions-Klasse basteln, die die Automatik für dich übernimmt.
Zergling-new ist offline   Mit Zitat antworten
Alt 21.07.2007, 22:36  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.654
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Zitat:
Wäre ja fatal, wenn ein Nicht-senden eines COMMITs am Ende einen COMMIT auslösen würde.
Nicht ganz. Es gibt die Möglichkeit ein auto_commit einzustellen, damit nach jedem SQL-Block (z.B. bei ORACLE) das Statement in die DB geschrieben wird. Wie sich das bei MySQL genau verhält kann man aber sicher nachlesen.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine 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
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Template Engine vs PHP-Includes aktionkuba PHP Tipps 2007 16 19.06.2007 23:53
mySQL Engine MyISAM und INNODB Lindwyrm Datenbanken 3 14.04.2007 12:52
Tipp zur Volltextsuche? InnoDB zu MyISAM? bicpi Datenbanken 0 21.09.2006 17:43
PHP Grafik Engine? 250Euro Off-Topic Diskussionen 4 12.09.2006 17:29
Zend Engine guenterfrosch PHP Tipps 2006 10 22.08.2006 16:44
MySQL startet nicht mehr: InnoDB Hendrik007 Datenbanken 7 05.07.2006 11:21
Volltextsuche mit InnoDB guenterfrosch Datenbanken 2 04.06.2006 14:41
Datenbanktyp InnoDB und MyISAM mausemy Datenbanken 4 15.02.2006 22:21
phpMyAdmin startet nicht Datenbanken 12 02.02.2006 12:07
Beziehungen mit InnoDB??? T.Peters PHP Tipps 2006 1 25.01.2006 18:29
[Erledigt] Transaktionen mit Apache+PHP+MySQL Datenbanken 6 10.08.2005 08:04
1030: Got error 139 from storage engine Datenbanken 0 27.01.2005 17:09
[Erledigt] MySQL findet Datenbank nicht Datenbanken 10 21.10.2004 09:14
Mehrere Dateien gleichzeitig Download (OWL Intranet Engine) PHP Tipps 2004 0 07.10.2004 15:16
Transaktionen Datenbanken 3 28.09.2004 18:41

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
mysql innodb transaction, innodb transaction, innodb transaction php, innodb transaktionen, php innodb transaction, innodb transaktion, php mysql transactions innodb, http://www.php.de/datenbanken/44406-transaktion-en-mit-der-innodb-engine-aber-wie.html, php mysql transaction, php rückgängig wenn falsch sql insert into, innodb last_insert_id, php innodb last_insert_id(), mysql innodb transaktion, php innodb transaktion, mysql innodb transaktionen, transaction innodb, mysql_query innodb, php innodb transaktionen, innodb transaction commi phpt, php inoodb

Alle Zeitangaben in WEZ +2. Es ist jetzt 06:33 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.