[MySQL] getAndIncrement fuer MySQL gesucht

Scotty86

Mitglied
Ich habe auf die Schnelle keine Antwort mit Google oder Suche gefunden:

Problem:
Ich muss ein Feld aus einer MySQL-Datenbank auslesen und gleichzeitig erhoehen. Nennen wir diese Feld ganz simpel "Counter".
Verwende ich 2 Queries direkt hintereinander besteht die Gefahr, dass zwischen diese Queries ein anderer Aufruf mit der selben Operation rutscht. BOOM schon hat der 2. Aufruf falsche Daten.

Hat jemand eine Idee wie ich gleichzeitig ich schreiben und lesen kann mit MySQL, bzw lesen und schreiben? Oder einen anderen Ansatz?

Nochmal zur Verdeutlichung und besseren Reindenken:
Ich habe 2 Tabellen
Tabelle1: Name;Counter
Tabelle2: Name(Tabelle1),Count_Hit,Username

User "Mustermann" ruft die Operation mit dem Namen "Kopieren" auf.
Etz muss der aktuelle Counter zum Namen "Kopieren" aus Tabelle1 ausgelesen werden und gleichzeitig erhoeht werden. Danach wird in Tabelle2 der Name der Operation gespeichert, Der wie vielte Aufruf es war und der User der die Operation ausgefuehrt hat.

Damit sollte das Problem klar sein, hoffe ich ;)
 
Also 2 Queries gleichzeitg absetzen geht nicht.
Wenn es aber um einen Counter geht könntest du das so lösen:

Code:
UPDATE tabelle SET spalte = spalte + 1;

Dann würden die Ergebnisse nicht verfälscht, weil der Datenbank-Server die Spalte hochrechnet.
Danach könnteste dann deine SELECT-Anfrage normal ausführen.
 
Also so wie ich das verstehe wollte er genau deinen Vorschlag nicht ;)
Weil so muss er es mit 2 queries machen...

Mir fehlt gerade irgendwie ein Wort zur Lösung von solchen Problemen.

Erklärung:
Man startet ein(e) <Wort fehlt>.
Nun führt man alles aus was man gerne möchte und am ende schließt man den/die <Wort fehlt> - dann werden die Daten erst weggeschrieben.

Transaktionen? Kein Plan... Sessions?
Man wie hießen die Teile nochmal :)

Ich komme gerade nicht drauf aber die Datenbankexperten können dir sicher helfen :)
Weiß aber gerade nicht ob das auf dein Problem anwendbar ist...

EDIT:
Jaaaa Transaktionen :)
http://www.usegroup.de/software/phptutorial/eine_kleine_mysql-referenz.html#transaktionen
(beschreibt eigentlich genau dein Problem...)
 
Ui, das sieht glaub ich ganz gut aus :D

Noch mal kurz Rezitieren:
begin-commit hilft in meinem Problem glaube nichts oder? Weil es macht eigentlich nix anderes ausser Tabellen-Operationen zu simulieren um zu schauen ob das rischtige rauskommt, wenn ja wird mit commit das ausfuehren auf der tatsaechlichen DB bestaetigt?
Hilft mir hier aber nix, da quasi 2 Threads gleichzeitig Daten lesen koennen, somit entsetht wieder das ganz oben beschriebenen Problem.

Allerdings hast du mich damit auf eine andere Loesung gestossen: LOCK TABLE
Dies wirkt aber auf mich wie eine Holzhammer-Methode, v.a. weil es Fehler wirft wenn ein Ueberschneidungsfall eintreten sollte. Gibt es vllt noch etwas eleganteres? :D
Bzw hab ich bei begin-commit in der Hinsicht etwas falsch verstanden?

Auf jeden Fall schon mal Danke fuer die neuen Ansaetze ;)
 
Ich bin mir nicht sicher wie genau Begin und Commit mit den anderen Daten die sich verändert haben umgehen.

Warte besser mal auf spezialisten die sich mit dem Thema besser auskennen.
So fit bin ich da auch nicht - kann nur das nötigste ;)

Lock-Table würde ich nicht unbedingt machen - da gibts sicher eleganteres...

Eventuell das hiernochmal genau lesen:
http://dev.mysql.com/doc/refman/5.0/en/commit.html
 
Also ich hab noch bisschen gesucht und hab in der MySQL-API nix finden können ausser eben LOCK TABLE

„Atomar“, wie wir es hier verstehen, hat nichts mit Zauberei zu tun. Damit ist lediglich gemeint, dass gewährleistet ist, dass, solange ein bestimmtes Update durchgeführt wird, dieses von keinem anderen Benutzer unterbrochen werden kann und dass es keinen automatischen Rollback gibt (was bei transaktionalen Tabellen immer möglich ist, wenn Sie nicht mit extremer Sorgfalt vorgehen). MySQL Server garantiert außerdem, dass es nicht zur Dirty Reads kommt.
Die folgende Liste erläutert ein paar Methoden für die Arbeit mit nichttransaktionalen Tabellen:
  • Schleifen, die Transaktionen erfordern, lassen sich normalerweise mithilfe von LOCK TABLES kopieren. Sie benötigen keine Cursor, um Datensätze direkt zu aktualisieren.
  • Um die Verwendung von ROLLBACK zu umgehen, können Sie die folgende Strategie verwenden:
    1. Sperren Sie alle Tabellen, auf die Sie zugreifen wollen, mit LOCK TABLES.
    2. Prüfen Sie die Bedingungen, die wahr sein müssen, bevor Sie das Update durchführen.
    3. Sind alle Bedingungen erfüllt, dann führen Sie das Update durch.
    4. Heben Sie die Sperrungen Ihrer Tabellen mit UNLOCK TABLES auf.
    Wenn auch nicht immer, so funktioniert dies in der Regel doch wesentlich schneller als die Verwendung von Transaktionen mit möglichen Rollbacks. Die einzige Situation, die mit dieser Lösung nicht bereinigt werden kann, liegt vor, wenn jemand die Threads während eines Updates beendet. In diesem Fall werden alle Sperren aufgehoben, aber unter Umständen wurden manche Updates nicht ausgeführt.
 
Zurück