Ergebnis 1 bis 4 von 4

Thema: Doppelte MySQL-Einträge

  1. #1
    Azubi(ne)
    Registriert seit
    09.06.2008
    Ort
    Lambrecht (Pfalz)
    Beiträge
    90
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard Doppelte MySQL-Einträge

    Hallo,

    ich bin vor ein paar Tage mit meinem Browsergame an den Start gegangen und bisher wird es ordentlich geklickt. Jetzt hab ich das Problem das anscheinend einige Datenbankeinträge doppelt gemacht werden und ich hab keine Ahnung woran das liegt...

    Naja, da ich so ein Problem noch nie hatte weiß ich nicht was ich dagegen tun könnte. Vielleicht hat ja jemand von euch ein Vorschlag hierzu?

    MfG
    Red
    Achtung: Dies ist ein alter Thread im HTML und Webmaster Forum
    Diese Diskussion ist älter als 90 Tage. Die darin enthaltenen Informationen sind möglicherweise nicht mehr aktuell. Erstelle bitte zu deiner Frage ein neues Thema im Forum !!!!!

  2. #2
    Bandit
    Gast

    Standard AW: Doppelte MySQL-Einträge

    Deine Infos reichen nicht. Was wird wann doppelt eingetragen? Wie sieht die DB-Struktur bzw. die entsprechende Tabelle aus? Wie sieht das dazugehörige Script aus?

  3. #3
    Azubi(ne)
    Themenstarter

    Registriert seit
    09.06.2008
    Ort
    Lambrecht (Pfalz)
    Beiträge
    90
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard AW: Doppelte MySQL-Einträge

    Naja, es handelt sich um ein Weltraum-Strategiespiel. Dabei können die Spieler Flotten auf andere Planetzen schicken etc. daher musste ich für die Ausführung der Missionen am Zielplaneten bzw. bei der Rückkehr ein Eventhandler schreiben.
    Das Problem kommt nun bei der Rückkehr der Schiffe vor, in dem Moment in der die Schiffe aus der "flotten" (Tabelle der derzeit fliegenden Flotten) in die "planeten" (Tabelle aller Planeten und dessen Werte wie Gebäude, Schiffe) übertragen werden. Bei diesem Vorgang wird der Eintrag ab-und-zu doppelt in die "planeten"-Tabelle eingetragen. Wie erwähnt geschieht des mehr oder weniger zufällig, daher denke ich, es liegt daran, dass mehrere Spieler diesen Eventhandler (der in jede Datei includiert & ausgeführt wird) aufrufen und somit eben die Befehle zeitgleich ausgeführt und daher verdoppelt werden.

    Ich hab es mal mit LOCK TABLES versucht, weil ich dachte die Funktion sei für solche Probleme, jedoch scheint es trotzdem noch vorzukommen.

    PHP-Code:
    $db->query("LOCK TABLE 'mehrere Tabellen' WRITE""");
    $EVENTHANDLER= new eventhandler;
    if (
    $EVENTHANDLER->initialisieren()) {
        
    $EVENTHANDLER->startevents();
    }
    $db->query("UNLOCK TABLES",''); 
    Der Datenbank-Benutzer besitzt das Recht, LOCK TABLES auszuführen.

    Ich hoffe diese Infos reichen um einen kleinen Überblick zu bekommen?

    MfG

  4. #4
    Forum Guru Avatar von The User
    Registriert seit
    28.10.2007
    Ort
    Zwischen Pazifik und Atlantik...
    Beiträge
    4.044
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard AW: Doppelte MySQL-Einträge

    Was willst du denn mit dem LOCK erreichen? Dass der andere garnicht ausgeführt wird, oder?
    Schick mal den ganzen Query, die bloßen DB-Namen sind ja wohl kaum geheim.

    Probier eventuell mal die shm- und sem-Funktionen.

    Edit:
    Ich habe jetzt noch einmal nachgeschaut:
    LOCK TABLE wirkt quasi wie ein Semaphore: Das Script, das zu spät kommt, muss warten, bis das andere fertig ist, die Aktion wird dennoch durchgeführt.
    Ich schreib mal was kleines:
    PHP-Code:
    class LockException extends Exception
    {
      public 
    $data;
      public function 
    __construct($message$data null)
      {
        
    parent::__construct($message);
        
    $this->data $data;
      }
    }
    class 
    Lock
    {
    protected static 
    $shmid 7621461;
    public static function 
    tryIt($transactionid$datafunc null)
    {
      
    $c shm_attach(self::$shmid);
      
    $s sem_get(self::$shmid);
      
    sem_acquire($s);
      
    $v = @shm_get_var($c$transactionid);
      
    sem_release($s);
      if(
    $v !== false)
        throw new 
    LockException('It is locked'$v);
      
    sem_acquire($s);
      
    $data is_callable($datafunc) ? call_user_func($datafunc$transactionid) : $datafunc;
      
    shm_put_var($c$transactionid$data);
      
    sem_release($s);
      
    sem_remove($s);
      
    shm_detach($c);
      return 
    $data;
    }
    public static function 
    releaseIt($transactionid)
    {
      
    $c shm_attach(self::$shmid);
      
    $s sem_get(self::$shmid);
      
    sem_acquire($s);
      
    $result = @shm_remove_var($c$transactionid);
      
    sem_release($s);
      
    sem_remove($s);
      
    shm_detach($c);
    }

    Alternativ kannst du aus $c (connection) und $s (semaphore) auch statische Klassenmember machen oder das Ganze nicht statisch aufziehen. So kannst dus dann anwenden, du brauchst eben ne Transaction-ID:
    PHP-Code:
    $transactionid ermittleDatenSatzDerNichtDoppeltEingefügtWerdenDarf();
    function 
    erzeugeDatenSatz($id)
    {
      
    // Aus DB lesen...
    }
    try
    {
      
    $data Lock::tryIt($transactionid'erzeugeDatenSatz');
      
    fügeEin($data);
      
    Lock::releaseIt($transactionid);
    }
    catch(
    LockException $e)
    {
      
    // Daten wurden schon eingefügt
      // $e->data kann nun verwendet werden
      
    $data $e->data;
    }
    // Nun kann $data verwendet werden, egal ob es vom Thread neu eingefügt wurde oder ein anderer Thread zuvorgekommen ist 
    Die Daten werden hierbei nur erzeugt, wenn nicht gelockt wurde. Wenn die Daten in jedem Thread einzeln erzeugt werden sollen, sieht es so aus:
    PHP-Code:
    $transactionid ermittleDatenSatzDerNichtDoppeltEingefügtWerdenDarf();
    $data erzeugeDatenSatz($transactionid);
    try
    {
      
    Lock::tryIt($transactionid$data);
      
    fügeEin($data);
      
    Lock::releaseIt($transactionid);
    }
    catch(
    LockException $e)
    {
      
    // $data ist sowieso schon gesetzt
    }
    // $data kann verwendet werden 
    Hierbei muss nicht mehr zwingend eine Funktion zur Datensatzerzeugung erstellt werden, dafür macht jeder Thread sein eigenes Ding.

    Hinweise:
    Das ganze funktioniert nicht unter Windoof.
    $transactionid muss ein Integer sein.
    $data kann eine beliebige Variable sein. (Objekt, Array,..., bloß keine Ressource oder boolesches false)

    Viele liebe Grüße
    The User

    Edit:
    Ich habe es jetzt getestet und es geht.
    Wer es probieren möchte, öffnet einfach 2-3mal dieses Script:
    PHP-Code:
    <?
    header
    ('content-type: text/html; charset=utf-8');
    require_once 
    'lock.php';
    $transactionid 150;
    function 
    erzeugeDatenSatz($id)
    {
        return 
    rand() % $id;
    }
    try
    {
      
    $data Lock::tryIt($transactionid'erzeugeDatenSatz');
      
    sleep(10);
      echo 
    'Eingefügt: ' $data;
      
    Lock::releaseIt($transactionid);
    }
    catch(
    LockException $e)
    {
      
    // Daten wurden schon eingefügt
      // $e->data kann nun verwendet werden
      
    echo 'Jemand anders war schneller';
      
    $data $e->data;
    }
    echo 
    '<br/>Der Datensatz ist nun: ' $data;
    // Nun kann $data verwendet werden, egal ob es vom Thread neu eingefügt wurde oder ein anderer Thread zuvorgekommen ist  
    ?>
    Und - oh Wunder - einer lockt und die anderen erhalten die selbe Zufallszahl.
    Geändert von The User (08.03.2009 um 18:22 Uhr)

Ähnliche Themen

  1. Array auf doppelte Einträge prüfen
    Von Donkey im Forum PHP Forum - Apache - CGI - Perl - JavaScript und Co.
    Antworten: 9
    Letzter Beitrag: 31.01.2009, 16:30
  2. Problem mit MySQL Klasse (Doppelte Ausgabe)
    Von reggit im Forum PHP Forum - Apache - CGI - Perl - JavaScript und Co.
    Antworten: 5
    Letzter Beitrag: 09.07.2008, 00:32
  3. Formular-doppelte Einträge bei Reload
    Von Matti im Forum PHP Forum - Apache - CGI - Perl - JavaScript und Co.
    Antworten: 2
    Letzter Beitrag: 02.04.2008, 09:12
  4. MySQL Datenbank Einträge - Wie???
    Von ludgerf321 im Forum HTML & CSS Forum
    Antworten: 4
    Letzter Beitrag: 19.12.2007, 00:26
  5. Doppelte Einträge verhindern
    Von Mir nicht im Forum PHP Forum - Apache - CGI - Perl - JavaScript und Co.
    Antworten: 2
    Letzter Beitrag: 03.11.2005, 13:39

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •