sql php start transaction

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

  • #16
    hatte ich schon versucht, auch mit ner while true schleife aber da ist er dann überlasetet glaub ich *g*
    wenn ich sleep mache zb. sleep(10) dann dauert es 10 sekunden bis er das script ausführt.

    PHP-Code:
    <?php
    session_start
    ();
    require_once(
    'datenbankverbindung.php');

    $id $_POST['transmit'];
    echo(
    $id);
    $sql=db_connect();


    $result=$sql->query("START TRANSACTION");
    UPDATE NOWAIT");
    $result=$sql->query("SELECT FROM angebot WHERE id='$id' FOR UPDATE");
    if(!
    $result)
    echo("
    gesperrt");
    else
    echo("
    nicht gesperrt");
    sleep(10);
    $angebot=$result->fetch_assoc();


    ?>
    oben steht zb. echo($id); das gib der dann erst nach 10 sekunden aus und dann auch eben 'nicht gesperrt'. im zweiten browser vom anderen rechner genauso.

    also die table angebot ist innoDB und in xampp steht eben have innoDB =YES bei den variablen

    Kommentar


    • #17
      Das zweite Skript wartet darauf, dass der Lock frei gegeben wird, d.h. es ist durchaus natürlich, dass bei beiden "nicht gesperrt" zurück gegeben wird. Was wichtig ist, ist die Zeit, nach der "nicht gesperrt" beim zweiten Skript ausgegeben wird - wenn es sofort geschieht ist was falsch, wenn das erst geschieht, wenn das erste Skript beendet wurde, ist alles richtig.

      Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

      bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
      Wie man Fragen richtig stellt

      Kommentar


      • #18
        ja passiert erst wenn das erste script zuende ist.

        allerdings krieg ich jetzt die kriese

        wieso funktioniert die update anweisung nicht?
        in xampp als sql befehl eingegeben funktioniert es.
        hier aber nicht
        PHP-Code:
        <?php
        session_start
        ();
        require_once(
        'datenbankverbindung.php');

        $id $_POST['transmit'];
        echo(
        $id);
        echo(
        "<br>");    
        $sql=db_connect();


        $result=$sql->query("START TRANSACTION");

        $result=$sql->query("SELECT * FROM angebot WHERE id='$id' FOR UPDATE");


        $result=$sql->query("UPDATE angebot SET belegt = 1 WHERE id='$id'");  

        echo(
        "<br>");    
        if(
        $result)
        echo(
        "kein fehler");
        else
        echo(
        "fehler");
        $result=$sql->query("COMMIT");


        ?>
        sorry aber ich seh nicht wieso das hier nicht gehen soll,.
        Zuletzt geändert von Xadine; 06.08.2007, 00:04.

        Kommentar


        • #19
          Bitte gib uns eine vernünftige Fehlerbeschreibung (an dieser Stelle sei die Verwendung von mysql_error() angepriesen) und wenn es notwendig ist eine Erklärung der DB-Klasse.

          Ach und erkläre bitte, warum du dir unbedingt durchs Knie in die Brust schießen willst. In deinem Script da oben kannst du alles außer dem UPDATE entfernen und es hat genau den gewünschten Effekt.

          Kommentar


          • #20
            also hatte es weggelassen damit es übersichtlicher wird.
            wenn der eintrag belegt=0 ist dann soll er das update machen. und niemand anderes darf in der zeit lesen das belegt =0 ist weil ja jetzt ein update kommt
            wie du siehst ist auch die error funktion direkt danach aufgerufen worden allerdings werden folgende zeile ausgegeben
            also

            1
            nicht belegt

            fehler


            1 <--- hier die id
            nicht belegt <--- belegt=0 also nicht belegt
            <--- echo (mysql_error());
            fehler <--- result ist nicht true


            PHP-Code:
            <?php
            session_start
            ();
            require_once(
            'datenbankverbindung.php');

            $id $_POST['transmit'];
            echo(
            $id);
            echo(
            "<br>");    
            $sql=db_connect();


            $result=$sql->query("START TRANSACTION");

            $result=$sql->query("SELECT * FROM angebot WHERE id='$id' FOR UPDATE");

            $angebot=$result->fetch_assoc();
            if(
            $angebot['belegt']==1)
                echo(
            "belegt");
            else{
            echo(
            "nicht belegt");
            $result=$sql->query("UPDATE angebot SET belegt = 1 WHERE id='$id'"); 
            echo (
            mysql_error());
            }
            echo(
            "<br>");    
             

            echo(
            "<br>");    
            if(
            $result)
            echo(
            "kein fehler");
            else
            echo(
            "fehler");
            $result=$sql->query("COMMIT");


            ?>
            und so sieht die require_once klasse aus

            PHP-Code:
            <?php
            session_start
            ();
            function 
            db_connect()
            {
                
            $sql = new mysqli("192.168.0.2","root","","dating");
                if (!
            $sql)
                    throw new 
            Exception('Keine Verbindung zum Datenbankserver moeglich');
                else
                    return 
            $sql;
            }
            ?>
            danke für die hilfe um die zeit
            xadine
            Zuletzt geändert von Xadine; 06.08.2007, 00:49.

            Kommentar


            • #21
              Original geschrieben von Xadine
              wenn der eintrag belegt=0 ist dann soll er das update machen.
              PHP-Code:
              $sql->query("UPDATE angebot SET belegt = 1 WHERE id=$id AND belegt=0"); 
              if (
              $sql->affected_rows == 1)
                  echo 
              'war frei, ist jetzt belegt';
              else
                  echo 
              'war schon belegt'

              Kommentar


              • #22
                danke schön, allerdings macht er immernoch kein update.
                wenn ich den befehl manuel in xampp eingebe also in php myadmin dann gehts hier aber nicht
                ich versuchs morgen nochmal weiter und melde mich dann.

                aber sagmal mit dieser abfrage brauche ich die ganzen transaktionen und innoDB nicht?
                Zuletzt geändert von Xadine; 06.08.2007, 01:25.

                Kommentar


                • #23
                  Richtig, brauchst du nicht.

                  Eine einzelne Query ist immer auch eine Transaktion im Sinne des ACID-Prinzips und das DBMS kümmert sich automatisch um das Locking der Datensätze.
                  Ich dachte anfangs, dass du im Laufe deiner Transaktion noch irgendwas in PHP machst. Aber dir geht es ja nur darum, dem User mitzuteilen, wie der Zustand vor und nach dem Update ist. Das kann man allein an der Zahl der betroffenen Datensätze feststellen. (Dabei muß id allerdings unique sein.)
                  Zuletzt geändert von onemorenerd; 06.08.2007, 01:35.

                  Kommentar


                  • #24
                    ey ich komm nicht ins bett.

                    also ich mache nichts weiter in php. ich dachte aber es könnte sein das in ner millisekunde zwei selects gemacht werden und zweil querys belegt auf 1 setzen.

                    trotzdem das update will nicht gehen. hab auch id auf unique, weiss zwar nicht wofür habs aber gemacht. hab auch die table wieder auf myisam gesetzet, oder muss es doch auf innoDB bleiben.

                    will doch nur ein update jetzt noch hinkriegen )-:

                    Kommentar


                    • #25
                      Ist doch nicht so schwer. Hast du phpMyAdmin zu Hand? Dann führe darin mal die folgenden Queries nacheinander aus - mit einer existierenden ID selbstverständlich:

                      Ist der Datensatz mit der ID 1 "frei"?
                      SELECT * FROM angebot WHERE id=1 AND belegt=0

                      Ändere ihn auf "belegt".
                      UPDATE angebot SET belegt=1 WHERE id=1 AND belegt=0

                      Jetzt sollte der Datensatz mit der ID 1 "belegt" sein.
                      SELECT * FROM angebot WHERE id=1 AND belegt=1


                      So, die erste und die letzte Query waren jetzt nur zur Kontrolle. In deinem Script brauchst du sie nicht. Und damit gibt es dann auch keine "millisekunde" zwischen zwei Queries - du hast ja nur noch eine.

                      Kommentar


                      • #26
                        also die queries gehen in phpmyadmin wunderbar
                        alle 3

                        habs mit id =1 gemacht

                        so jetzt in php

                        PHP-Code:
                        session_start();
                        require_once(
                        'datenbankverbindung.php');

                        $id $_POST['transmit'];

                        $sql=db_connect();



                        $result=$sql->query("UPDATE angebot SET belegt=1 WHERE id=2 AND belegt=0"); 
                        alles andere rausgenommen aber in der datenbank tut sich nichts.

                        woran kann sowas liegen? select queries funktionieren aber dieses update eben nicht. der code ist ja hier schon ziemlich puristisch.

                        so gehts auch nicht
                        PHP-Code:
                        $result=$sql->query("UPDATE angebot SET belegt='1' WHERE id='2' AND belegt='0'"); 
                        belegt ist tinyint datentyp groesse 4
                        und id ist index und unique

                        Kommentar


                        • #27
                          Die erste Query ist richtig, die zweite nicht. Zahlen sind keine Strings.
                          Mach mal echo $sql->mysqli_error() nach der Query.

                          Kommentar


                          • #28
                            jaaaaaaaaaaaaaaaaaaaaaaaa
                            jaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
                            jaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

                            besser als ************ (-:

                            UPDATE command denied to user ''@'Xadine-PC' for table 'angebot'


                            jaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

                            et geehtt.

                            danke schön aber ich musste es so machen
                            printf("Errormessage: %s\n", mysqli_error($sql));
                            deine variante ging nicht so ganz.

                            muss jetzt meine datenbank innoDB sein?
                            ich verstehs noch nicht ganz.
                            wenn zwei pcs die scripte gleichzeitig ausführen wird in der datenbank das aber sequentiell abgearbeitet?
                            obwohl die können ja durch tcpip nur sequentell ankommen die php anfragen oder nicht?

                            Kommentar


                            • #29
                              Meine Güte, hör auf mit Halbwissen um dich zu werfen, davon krieg ich Kopfschmerzen. Ob die Verbindung per tcp, socket, oder Brieftaube an die Datenbank geht, ist doch vollkommen egal - genauso wie php absolut nichts mit mysql zutun hat.

                              Ein Query ist für sich atomar, sowohl in myisam, wie auch in innodb - was du auch innerhalb von 20 Sekunden bei Google hättest heraus finden können.
                              Zuletzt geändert von ghostgambler; 06.08.2007, 13:34.

                              Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                              bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                              Wie man Fragen richtig stellt

                              Kommentar


                              • #30
                                es ging mir bei tcp darum dass man nicht gleichzeitig 2 anfragen kriegen kann. was aber nicht bedeutet das die anfragen wenn die anfragen nicht atomar sind gleichzeitig abgearbeitet werden können durch einen "switch" in sql zb., wie wenn ein betriebssystem zwischen zwei prozessen schaltet.
                                wenns überhaupt so ein anfragewechsel in sql gibt, keine ahnung.

                                php, ist klar, bietet nur ne schnittstelle zur datenbank
                                .

                                was ich gesucht habe war ähnliches wie dieses hier

                                Die Tabellensperrung gestattet mehreren Threads das Lesen aus der Tabelle zur selben Zeit; will ein Thread hingegen in eine Tabelle schreiben, so muss er zunächst exklusiven Zugriff erhalten. Alle anderen Threads, die auf die betreffende Tabelle zugreifen wollen, müssen warten, bis das Update abgeschlossen ist.

                                wollte nur ne zeile sperren und das dann auch richtig machen
                                egal,
                                danke für deine hilfe
                                Zuletzt geändert von Xadine; 06.08.2007, 13:04.

                                Kommentar

                                Lädt...
                                X