php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 10.11.2005, 13:43  
Benutzer
 
Registriert seit: 28.01.2005
Beiträge: 83
MrCavity
Standard MySql abfragen durcheinander?

hallo...
ich habe mal eine frage...
ich habe ein kleines spiel mit php programmiert.
wenn ein user nun z.b. eine bestimmte aktion im spiel durchführt,
greife ich auf die db zu, hole daten, verändere diese und update die db wieder. wenn nun aber mehrere user diese aktion durchführen, kann es da sein, das die db durcheinander gerät, oder stellen sich die abfragen wie in
einer schlange hinter einander an?

also zb: durch einen klick auf einen button wird folgendes automatsich gemacht:
eine zeile der db sieht so aus: "0,0,0,0,0,0"
user1 holt sich die daten, sie werden automatisch zu "0,1,0,0,0,0" verändert und wieder geupdatet. alles durch einen klick...

wenn nun aber user2 dazwischen funkt und gleichzeitig klickt und die daten holt bevor user1 sie abspeichern konnte und hat also auch noch den ursprungsstring "0,0,0,0,0,0" und bei ihm wird es zu "0,0,0,1,0,0"...
dann würde er es ja auch so abspeichern und in der db würde "0,0,0,0,1,0" stehen anstatt "0,1,0,0,1,0,"...

ich hoffe das schnallt jemand!?
MrCavity ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 10.11.2005, 13:55  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Du könntest die Datenbank solang sperren. Das Schlagwort dürfte LOCK sein.
Zergling-new ist offline   Mit Zitat antworten
Alt 10.11.2005, 15:09  
Benutzer
 
Registriert seit: 28.01.2005
Beiträge: 83
MrCavity
Standard

aha, wenn ich das nicht tue könnte also was durch ein ander geraten?

finde ich irgendwo eine beschreibung zu "LOCK" im netz?
MrCavity ist offline   Mit Zitat antworten
Alt 10.11.2005, 15:30  
Benutzer
 
Registriert seit: 28.01.2005
Beiträge: 83
MrCavity
Standard

wenn ich nun z.b. aus:

$holdiedaten = mysql_query("SELECT * FROM tabelle1");
while($row = mysql_fetch_array($holdiedaten)){
$id=$row[id];$text=$row[text];
}
...$text wird automatisch modifiziert...
$aendern = "UPDATE tabelle1 Set text = '$text' WHERE id = '$id'";
$update = mysql_query($aendern);

folgendes machen würde:

mysql_query("LOCK TABLES tabelle1 WRITE");
$holdiedaten = mysql_query("SELECT * FROM tabelle1");
while($row = mysql_fetch_array($holdiedaten)){
$id=$row[id];$text=$row[text];
}
...$text wird automatisch modifiziert...
$aendern = "UPDATE tabelle1 Set text = '$text' WHERE id = '$id'";
$update = mysql_query($aendern);
mysql_query("UNLOCK TABLES tabelle1");

wäre dann mein problem gelöst?
und was ist nun bei gleichzeitigem aufruf des scripts zweier user?
wartet der eine dann automatisch kurz oder bekommt er ne fehlermeldung,
das auf die db nicht zugegriffen werden kann?
MrCavity ist offline   Mit Zitat antworten
Alt 10.11.2005, 16:15  
Erfahrener Benutzer
 
Registriert seit: 02.03.2005
Beiträge: 305
DerDesian
Standard

Hi,

Du kannst davon ausgehen, dass die Daten nicht durcheinander kommen.
SQL-Anfragen werden in der Reihenfolge abgearbeitet, in der sie an die DB gesendet werden.

Bei Dingen, die nur Bedingt Änderungen sein sollen, so zB. Löschen eines Objektes und seiner Abhängigkeiten in verschiedenen Tables empfiehlt sich eine Transaktion.
Ein Transaktion ist atomar. dh. Innerhalb einer Transaktion werden alle querys ausgeführt, ohne das eine andere Transaktion dazwischenfunken kann.

Geht was schief ist keines der Querys ausgeführt, gehts glatt sind alle durch.

Für mySQL funktionieren Transaktionen bei der InnoDB, nicht by myISAM(standart). Dafür ist InnoDB auch langsamer.

Eine zweite möglichkeit sind Trigger oder Rules. Das heißt, wenn ein Datensatz gelöscht wird, kann man einstellen, dass DB-Seitig abhängige Datensätze der selben oder anderer Tables automatisch gelöscht werden.

Ich würd mir überlegn ob ich das Problem nicht durch irgendeine elegante Logic umgehen kann. Oder ob es exestentiell für die Anwendung ist, denn of wird es einfach nicht gebraucht.

Gruß
Der Desian
__________________
Wenn dich was ankotzt, machs besser.
DerDesian ist offline   Mit Zitat antworten
Alt 10.11.2005, 16:31  
Benutzer
 
Registriert seit: 28.01.2005
Beiträge: 83
MrCavity
Standard

mmm, so richtig hab ich es nicht verstanden..

egal, aber wenn ich was lese, dann verändere und dann wieder speicher und mir soll da niemand dazwischen funken, kann ich das so handhaben?:

mysql_query("LOCK TABLES tabelle1");
lesen...
verändern...
schreiben...
mysql_query("UNLOCK TABLES tabelle1");

oder ist das falsch?
p.s. was ist wenn ich mal das UNLOCK vergesse, wie lang ist die db denn dann unlocked?
MrCavity ist offline   Mit Zitat antworten
Alt 10.11.2005, 16:40  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

3 Jahre.
Zergling-new ist offline   Mit Zitat antworten
Alt 10.11.2005, 16:43  
Benutzer
 
Registriert seit: 28.01.2005
Beiträge: 83
MrCavity
Standard

blödmann
MrCavity ist offline   Mit Zitat antworten
Alt 10.11.2005, 17:05  
Erfahrener Benutzer
 
Registriert seit: 02.03.2005
Beiträge: 305
DerDesian
Standard

Spaß muß sein
Aber:
Transaktionen macht man so:

$query = 'BEGIN'; // Ja es heißt wirklich begin
$query = 'SELECT INSERT UPDATE ..bla';
$query = 'COMMIT';
(Ausführen noch, natürlich)

Alles was zwishen BEGIN und COMMIT steht wird unteilbar geschehen.

Stolpersteine:
Transaktionen funktionieren nicht mit der Standarteistellung von mySQL (myISAM).
Man muß/kann den dbType ändern.. in InnoDB
mySQL hat ein normalerweise ein Aotocommit, das nach jedem Statement ausgeführt wird. das muß man ausschalten.
Schlicht mit: AUTOCOMMIT OFF

Ganz genau beschrieben ist es hier.

Gruß
Der Desian
__________________
Wenn dich was ankotzt, machs besser.
DerDesian ist offline   Mit Zitat antworten
Alt 10.11.2005, 18:19  
Benutzer
 
Registriert seit: 28.01.2005
Beiträge: 83
MrCavity
Standard

aha...

und was passiert, wenn ein user gerade eine tabelle updaten möchte wenn ein anderer gerade in dieser

$query = 'BEGIN'; // Ja es heißt wirklich begin
$query = 'SELECT INSERT UPDATE ..bla';
$query = 'COMMIT';

schleife steckt? bekommt der dann ne fehlermeldung oder wartet php kurz und stellt sich "hinten an"?
MrCavity 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
Berechnung über mehrere Abfragen aus mysql Slappi PHP Tipps 2008 2 18.12.2007 14:22
Mysql PHP Zahlenfeld aus DB abfragen? darkmana PHP Tipps 2008 10 12.10.2007 11:54
PHP bzw. mysql abfragen optimieren Kori Datenbanken 3 26.09.2007 21:02
Daten aus MySQL Datenbank abfragen trivial Datenbanken 2 29.04.2006 17:48
[Erledigt] Dynamische Ausgabe von Mysql Abfragen PHP-Fortgeschrittene 1 21.10.2005 10:53
[Erledigt] MYSQL abfragen begrentzt? PHP Tipps 2005-2 23 28.09.2005 16:18
[Erledigt] Jahr und Monat aus DATE spalte in MySQL abfragen. Datenbanken 7 24.09.2005 02:40
Suche Tipps für Persormance-Steigerung (Geld für Nützliches) Beitragsarchiv 18 16.08.2005 10:57
[Erledigt] MySQL Abfragen als Frage-Antwort Datenbanken 0 31.05.2005 18:35
info über mysql status abfragen nieselfriem Datenbanken 4 13.04.2005 09:42
Kann man Mysql Datenbanken abfragen ob Sie verfügbar sind ? Datenbanken 2 12.03.2005 16:39
between datum abfragen mysql hekto Datenbanken 2 12.01.2005 11:07
Password aus mySQL abfragen und vergleichen ob zu User passt PHP Tipps 2004 2 14.10.2004 10:15
Problem mit 2 gleichzeitigen MySQL abfragen PHP Tipps 2004 2 08.07.2004 13:57
MySQL DB Tabellen Kommentar abfragen Datenbanken 3 13.06.2004 22:41

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
mysql transactions bedingtes commit, php sql abfrage durcheinander, mysql bringt datensätze durcheinander, transaktion mysql, abfrage durcheinander php, abfrage durcheinander, mysql_fetch_array commit, mysql daten durcheinander, mysql bedingtes commit, mysql mysql_fetch_array commit php

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:44 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.