MySQL - Synchronisation

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • MySQL - Synchronisation

    folgendes: ich habe einen datensatz von user1

    user1 kann diesen nun abrufen und ändern
    genauso könnte aber user2 diese daten (teilweise) abrufen und ändern

    wie verhindere ich nun das zb user2 einen teil der daten ändert, dann user1 die daten lädt und dann user2 den rest der daten ändert, so dass user1 teilweise veraltete daten erhalten hätte

    ich hab eine funktion, um ne datensatz abzurufen und eine um den datensatz upzudaten

    wenn php immer ne ganze funtkion durchläuft bevor es was anderes macht müsste das problem ja gelöst sein (hoffe ich), was aber wenn php im time sharing modus arbeitet (ka wie php den code mehrerer user abarbeitet) und jetzt einen teil für user1 abarbeitet dann nen teil für user2 und dann den rest für user1 ?

    hoffe ihr versteht mein problem
    verantwortlich für Elygor - Das kostenlose Browserspiel

  • #2
    beim updaten ein LOCK TABLES machen.
    Zuletzt geändert von Abraxax; 01.12.2003, 23:26.
    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


    Kommentar


    • #3
      naja im prinzip net schlecht aber vielleicht nicht so ganz das was ich brauche, weil damit sperre ich ja ne ganze tabelle, mir reicht es wenn ich nur eine zeile (also alle daten einen benutzers) WHERE ID=$user_id sperre

      ausserdem weiss ich (hab mir deinen link durchgelesen) net, was ich mache wenn die tabelle nun LOCKED ist und nen anderer prozess versucht drauf zuzugreifen, gibt das ne bestimmte fehlermeldung die man abfangen kann, so dass ich ne schleife um die abfrage bauen kann die solange läuft bis die tabelle nicht mehr gesperrt ist oder ein zeitlimit erreicht wurde ?
      verantwortlich für Elygor - Das kostenlose Browserspiel

      Kommentar


      • #4
        Dann mußt Du Dir halt 'nen InnoDB Handler installieren ... und den Datensatz mit einem
        Code:
        SELECT ... FOR UPDATE
        sperren ...
        carpe noctem

        [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
        [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

        Kommentar


        • #5
          müsste dann auf dem server meiner page installiert sein, da hab ich wohl keinen einfluss drauf ...
          verantwortlich für Elygor - Das kostenlose Browserspiel

          Kommentar


          • #6
            und was machst du jetzt?
            INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


            Kommentar


            • #7
              - gelöscht aktuelles siehe unten
              Zuletzt geändert von sEeb; 02.12.2003, 22:18.
              verantwortlich für Elygor - Das kostenlose Browserspiel

              Kommentar


              • #8
                - nochmal gelöscht aktuelles siehe unten
                Zuletzt geändert von sEeb; 02.12.2003, 22:18.
                verantwortlich für Elygor - Das kostenlose Browserspiel

                Kommentar


                • #9
                  alle guten dinge sind drei

                  hier die fertigen funktionen
                  sry das ich jetzt so oft hintereinander gepostet hab, aber jetzt habt ihr zwei funktionen die was bringen
                  wie gesagt wenn ihr mir zustimmt das sie gut sind, poste ich sie im codeschnipsel bereich

                  PHP-Code:


                      
                  // grundgerüst zum ändern von daten aus einer DB
                      // beim starten der funtkion wird die entsprechende zeile (der datensatz) des users gesperrt
                      // beim verlassen könnenn andere wieder drauf zugreifen
                      //
                      // DB-Werte
                      //
                      // changing werte: 
                      //  0 wird nicht bearbeitet, datensatz kann abgerufen, verwendet werden
                      //  1 wird gerade bearbeitet
                      //
                      // changed werte:
                      //  0 datensatz wurde nicht geändert
                      //  1 datensatz wurde geändert
                      //
                      // parameter
                      // $id  id des datensatzes
                      // $table name der zu ändernden tabelle als string "name"
                      // $request spalten die geändert werden sollen, als string durch kommas getrennt ( "spalte1, spalte2, spalte3")
                      //
                      
                  function getDB($id$table$request) {
                          global 
                  $db_name$db_login$db_pass$einstellung;

                          
                  $ret_val "";
                      
                          
                  // anzahl bisheriger mitspieler herausfinden
                          
                  $link mysql_connect$db_name$db_login$db_pass)
                              or die (
                  "Es konnte keine Verbindung mit dem Datenbankserver hergestellt werden");
                          
                  $select_db mysql_select_db "finalwar"$link )
                              or die (
                  "Die Datenbank wurde nicht gefunden. Wenden sie sich an den Admin");
                          
                          
                  // ändern anmelden beim eintritt in funktion
                          // wenn bereits geändert wird, warten bis der datensatz wieder verfügbar ist
                          // maximal 10 sekunden warten, dann abrechen und von einem Fehler ausgehen    
                          
                  $start time();
                          do {
                              if (
                  time() - $start 10)
                                  die (
                  "Zeitüberschreitung der Anfrage. Bitte später nocheinmal versuchen. Sollte dieser Fehler öfters auftreten, bei einem Admin melden");

                              
                  // ändern anmelden, wenn möglich
                              
                  $query "UPDATE $table SET changing=1 WHERE ID='$id' AND changing=0 LIMIT 1";
                              
                  $result mysql_query($query$link)
                                      or die (
                  "Datenabruf kann nicht initialisiert werden: ".mysql_error());

                          }while( !
                  mysql_affected_rows($link) );

                          
                  // wurden die daten geändert?
                          
                  $query "SELECT changed FROM $table WHERE ID='$id' LIMIT 1";        
                          
                  $result mysql_query($query$link)
                                  or die (
                  "Datenabruf kann nicht initialisiert werden: ".mysql_error());
                          
                  $object mysql_fetch_object($result);
                          
                          if (
                  $object->changed) {
                              
                  $query "SELECT ".$request." FROM $table WHERE ID='$id' LIMIT 1";        
                              
                  $result mysql_query($query$link)
                                      or die (
                  "Datenabruf kann nicht ausgeführt werden: ".mysql_error());
                              
                  $ret_val mysql_fetch_object($result);
                          }

                          
                  // fertig, datensatz freigeben
                          
                  $query "UPDATE $table SET changing=0, changed=0 WHERE ID=$id LIMIT 1";
                          
                  $result mysql_query($query$link)
                                  or die (
                  "Fehler beim Verlassen einer DB-Funtkion, unbedingt einem Admin melden: ".mysql_error());

                          
                  mysql_close($link);

                          return 
                  $ret_val;        
                      }






                      
                  // grundgerüst zum abrufen von daten aus einer DB
                      // beim starten der funtkion wird die entsprechende zeile (der datensatz) des users gesperrt
                      // beim verlassen könnenn andere wieder drauf zugreifen
                      //
                      // DB-Werte
                      //
                      // changing werte: 
                      //  0 wird nicht bearbeitet, datensatz kann abgerufen, verwendet werden
                      //  1 wird gerade bearbeitet
                      //
                      // changed werte:
                      //  0 datensatz wurde nicht geändert
                      //  1 datensatz wurde geändert
                      // parameter
                      // $id  id des datensatzes
                      // $table name der zu ändernden tabelle als string "name"
                      // $changes spalten die geändert werden sollen, als string "spalte1=neue daten, spalte2=neue daten, spalte3=neue daten";
                      
                  function setDB($id$table$changes) {
                          global 
                  $db_name$db_login$db_pass$einstellung;
                      
                          
                  // anzahl bisheriger mitspieler herausfinden
                          
                  $link mysql_connect$db_name$db_login$db_pass)
                              or die (
                  "Es konnte keine Verbindung mit dem Datenbankserver hergestellt werden");
                          
                  $select_db mysql_select_db "finalwar"$link )
                              or die (
                  "Die Datenbank wurde nicht gefunden. Wenden sie sich an den Admin");    
                          
                          
                  // ändern anmelden beim eintritt in funktion
                          // wenn bereits geändert wird, warten bis der datensatz wieder verfügbar ist
                          // maximal 10 sekunden warten, dann abrechen und von einem Fehler ausgehen    
                          
                  $start time();
                          do {
                              if (
                  time() - $start 10)
                                  die (
                  "Zeitüberschreitung der Anfrage. Bitte später nocheinmal versuchen. Sollte dieser Fehler öfters auftreten, bei einem Admin melden");

                              
                  // ändern anmelden, wenn möglich
                              
                  $query "UPDATE $table SET changing=1 WHERE ID='$id' AND changing=0 LIMIT 1";        
                              
                  $result mysql_query($query$link)
                                      or die (
                  "Datenänderung kann nicht initialisiert werden: ".mysql_error());

                          }while( !
                  mysql_affected_rows($link) );

                          
                  // daten ändern
                          
                  $query "UPDATE $table SET ".$changes." WHERE ID='$id' LIMIT 1";
                          
                  $result mysql_query($query$link)
                                  or die (
                  "Datenänderung kann nicht ausgeführt werden: ".mysql_error());
                          
                          
                  // fertig, datensatz freigeben
                          
                  $query "UPDATE $table SET changing=0, changed=1 WHERE ID=$id LIMIT 1";
                          
                  $result mysql_query($query$link)
                                  or die (
                  "Fehler beim Verlassen einer DB-Funtkion, unbedingt einem Admin melden: ".mysql_error());

                          
                  mysql_close($link);    
                      } 
                  Zuletzt geändert von sEeb; 02.12.2003, 22:19.
                  verantwortlich für Elygor - Das kostenlose Browserspiel

                  Kommentar

                  Lädt...
                  X