tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
1
ZUGRIFFE
290
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von dwex
    dwex dwex ist offline Mitglied Platin
    Registriert seit
    Apr 2005
    Ort
    Landshut (Niederbayern)
    Beiträge
    695
    Hallo Leute,

    ich muss aus einer DB eine Zahl auslesen, verarbeiten, dieser dann 1 dazu zählen und wieder in der DB speichern.

    Jetzt habe ich mir gedacht, da es ja sein kann, dass wärend des verarbeitens jemand anderes auf diese Zahl zugreift und verändert und somit mein DB-Eintrag am Schluss nicht mehr stimmt.

    Jetzt habe ich (verkürzt) folgenden Code:
    PHP-Code:
    mysql_query("LOCK TABLES nummernkreise READ");

    $abfrage mysql_query("SELECT * FROM `nummernkreise` WHERE `jahr` = '".$berechnetes_jahr."' LIMIT 1");

    $daten mysql_fetch_array($abfrage);

    // einige berechnungen mit der zahl $daten['zaehler']
    // einige if´s und else´s
    // einige weitere mysql_query´s

    mysql_query("UPDATE `nummernkreise` SET `zaehler` = '".$neuer_zaehler."' WHERE `jahr` = '".$berechnetes_jahr."' LIMIT 1");

    mysql_query("UNLOCK TABLES"); 
    Wenn ich nun an das Update komme erhalte ich von MySQL eine Fehlermeldung nach dem Motto: du kannst die Tabelle nicht updaten weil du Sie zum lesen gesperrt hast.

    Kann mir jemand einen praktikablen Weg aufzeigen wie man das realisieren könnte ohne das zwischen meinen Abfragen (sind mehrere) dazwischen gefunkt wird?

    Vielen Dank im voraus!
     
    Ich würde mich über die Bewertung meiner Beiträge mit Kurzkommentar sehr freuen!

    Die "dumme Frage" ist gewöhnlich das erste Anzeichen einer völlig neuen Entwicklung!
    -------------------
    Es ist immer Zeit etwas zu verändern ....
    .... das alles so bleibt wie es ist!

    -------------------
    Homepage Landshut
    -------------------
    /voodoo.css
    #meinFeind {position: absolute; bottom: -6ft;}

  2. #2
    CPoly CPoly ist offline Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Wenn du InnoDB benutzt, ließe sich das wohl mit Transaktionen lösen. Aber darauf gehe ich nicht näher ein, weil es für dein Problem eine viel trivialere Lösung gibt. Lass diesen LOCK Kram weg und machen folgendes

    PHP-Code:
    mysql_query("UPDATE `nummernkreise` SET `zaehler` = $neuer_zaehler WHERE `jahr` = $berechnetes_jahr AND `zaehler` = $alter_zaehler"); 
    Wenn du jetzt prüfst, ob ein Datensatz verändert wurde (mysql_affected_rows), weißt du, dass in der Zwischenzeit niemand den Wert verändert hat. Falls mysql_affected_rows 0 liefert, musst du entsprechend darauf reagieren und z.B. den Wert neu auslesen und die Berechnungen erneut durchführen. Das heißt du könntest den ganzen Code in eine Schleife stecken.

    PHP-Code:
    do {
        
    //Hier das Auslesen, deine Berechnungen und das Update
    } while(!mysql_affected_rows($foo)); 
     

Ähnliche Themen

  1. MySQL: lock tables oder get_lock
    Von FrankWST im Forum Relationale Datenbanksysteme
    Antworten: 1
    Letzter Beitrag: 20.05.11, 11:47
  2. MySql LOCK TABLES
    Von Thomasio im Forum Relationale Datenbanksysteme
    Antworten: 0
    Letzter Beitrag: 21.02.11, 19:02
  3. Lock Tables
    Von dwex im Forum PHP
    Antworten: 3
    Letzter Beitrag: 16.03.09, 21:18
  4. Lock Tables bei MySQL
    Von XesperantoX im Forum Relationale Datenbanksysteme
    Antworten: 0
    Letzter Beitrag: 13.12.07, 14:28
  5. "lock tables" funktioniert irgendwie nicht
    Von Loctus im Forum Relationale Datenbanksysteme
    Antworten: 0
    Letzter Beitrag: 10.06.04, 15:54