sql php start transaction

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

  • sql php start transaction

    hallo bin noch ziemlich neu und habe ein problem

    hab zunächst in der datei xampp\mysql\bin\my.cnf
    folgendes editiert
    # Uncomment the following if you are using InnoDB tables
    innodb_data_home_dir = C:/Program Files/xampp/mysql/data/
    innodb_data_file_path = ibdata1:10M:autoextend
    innodb_log_group_home_dir = C:/Program Files/xampp/mysql/data/
    innodb_log_arch_dir = C:/Program Files/xampp/mysql/data/
    # You can set .._buffer_pool_size up to 50 - 80 %
    # of RAM but beware of setting memory usage too high
    set-variable = innodb_buffer_pool_size=16M
    set-variable = innodb_additional_mem_pool_size=2M
    # Set .._log_file_size to 25 % of buffer pool size
    set-variable = innodb_log_file_size=5M
    set-variable = innodb_log_buffer_size=8M
    innodb_flush_log_at_trx_commit=1
    set-variable = innodb_lock_wait_timeout=50

    um eine innobDB zu erhalten um transactionen ausführen zu könne.
    habe ich das so richtig gemacht? oder war das garnicht nötig?

    nun zum hauptproblem
    in php
    PHP-Code:
    <?php
    session_start
    ();
    require_once(
    'datenbankverbindung.php');
    $id $_POST['transmit'];

    $sql=db_connect();

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

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

    //if($angebot['belegt']==1)
    //    echo("belegt");
    //else
    //$result=sql->query("UPDATE angebote SET belegt=1 WHERE id='$id'");  
    //$result=sql->query("COMMIT");


    ?>


    hier kommt schon der erste Fehler
    Parse error: syntax error, unexpected T_OBJECT_OPERATOR in C:\Program Files\xampp\htdocs\angebotVeraendern.php on line 8
    also in der transactions anweisung.

    kann mir jemand vielleicht bitte sagen wie ich es richtig machen kann?

  • #2
    Wahrscheinlich gibt die Funktion db_connect() kein Object zurück sondern z.B. false weil der DB-Server nicht erreichbar ist. Damit ist $sql kein Object und du kannst nicht $sql->irgendwas verwenden!

    Kommentar


    • #3
      ne die verbindung funktioniert, aber du hast recht. in meinem code steht kein $ vor sql und somit verwende ich kein objekt. *g*
      oh mann!

      noch eine frage mit der restlichen code verhindere ich damit dirty ready von wenn jemand anderes diese zeile ausführt?

      PHP-Code:
      $result=sql->query("SELECT id FROM WHERE id='$id' FOR UPDATE NOWAIT"); 

      ausserdem diese abfrage SELECT id FROM WHERE id='$id' FOR UPDATE NOWAIT funktioniert noch nicht ganz was habe ich da syntaktisch falsch geschrieben?

      habe diesen befehl von hier http://dev.mysql.com/doc/refman/5.1/...ing-reads.html
      Zuletzt geändert von Xadine; 04.08.2007, 16:02.

      Kommentar


      • #4
        Keine Angst, der andere wird dir nicht reinpfuschen. Denn auch hier fehlt wieder das $-Zeichen und ein Tabellenname.

        Mal im Ernst: Was macht FOR UPDATE NOWAIT bei MySQL? Ich kenne es nur so, dass es eben nicht wartet bis ein gesperrter Datensatz freigegeben wird sondern sofort mit einer Fehlermeldung abbricht.
        Und da Locks auf Datensatzebene nicht Benutzerbezogen sind, ist es auch egal wer dieses SELECT ausführt.
        Zuletzt geändert von onemorenerd; 04.08.2007, 16:03.

        Kommentar


        • #5
          hm ich habs irgendwo mal gelesen mit dem NOWAIT

          ok,
          und was meinst du mit
          Und da Locks auf Datensatzebene nicht Benutzerbezogen sind, ist es auch egal wer dieses SELECT ausführt.
          wenn ein benutzer A auf einen button klickt soll er in einer zeile den wert von id auf 1 setzen und dabei diesezeile sperren, damit Benutzer B eine fehler meldung bekommt wenn er gleichzeitig diesen button klickt.

          gibt es ein szenario wenn zb 100 benutzer "gleichzeitig" den button klicken
          das vielleicht 2 Benutzeranfragen diese Zeile sperren ?

          Kommentar


          • #6
            Original geschrieben von Xadine
            gibt es ein szenario wenn zb 100 benutzer "gleichzeitig" den button klicken
            das vielleicht 2 Benutzeranfragen diese Zeile sperren?
            Es kann gleichzeitig viele Read Locks geben, aber nur ein eXclusive Lock. Wenn ein DBMS gleichzeitig mehrere X-Locks zuläßt, dann ist das ein Bug, denn damit ist Locking völlig sinnlos.
            Wie du merkst, beziehe ich mich nicht speziell auf MySQL. Bitte selbst testen, wenn es geschäftskritisch ist!

            Kommentar


            • #7
              ja ok werde es noch testen, erst morgen abend wieder.

              Dennoch einer frage noch, wie kriege ich einen exklusiven lock hin?
              oder ist das schon einer in meiner abfrage?
              ich will nicht das andere benutzer auch das gleiche lesen(select) wie der erste der den lock gemacht hat.

              Kommentar


              • #8
                Exclusive Locks sind für Schreiboperationen gedacht. Du machst aber nur ein SELECT. Es kann also auch parallel noch ein anderer lesen.
                Aber erklär mal bitte, warum du das verhindern willst. Dirty Read ist das nämlich sowieso nicht, denn dein SELECT macht die Daten nicht "dirty".

                Kommentar


                • #9
                  Wo genau steht eigentlich, was NOWAIT macht - und vor allem, dass MySQL das überhaupt könnte?
                  Ich finde nämlich dazu rein gar nichts im Manual...

                  Was hingegen "FOR UPDATE" bringt oder nicht bringt, wird genau erläutert
                  If you use FOR UPDATE with a storage engine that uses page or row locks, rows examined by the query are write-locked until the end of the current transaction. Using LOCK IN SHARE MODE sets a shared lock that allows other transactions to read the examined rows but not to update or delete them.
                  genauso wie deine Fragen mit dem Absatz beantwortet werden sollten.

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

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

                  Kommentar


                  • #10
                    Original geschrieben von onemorenerd
                    Exclusive Locks sind für Schreiboperationen gedacht. Du machst aber nur ein SELECT. Es kann also auch parallel noch ein anderer lesen.
                    Aber erklär mal bitte, warum du das verhindern willst. Dirty Read ist das nämlich sowieso nicht, denn dein SELECT macht die Daten nicht "dirty".
                    es wird doch ein update gemacht, und wenn zwei clienten selecten und einer updatet dann hat der andere doch ein "dirty read" weil das was er soeben selectet hat nicht mehr aktuel ist.

                    mit welchen schema macht mann den sowas? transaction und lock mässig?

                    Kommentar


                    • #11
                      Original geschrieben von ghostgambler
                      Wo genau steht eigentlich, was NOWAIT macht - und vor allem, dass MySQL das überhaupt könnte?
                      Ich finde nämlich dazu rein gar nichts im Manual...

                      Was hingegen "FOR UPDATE" bringt oder nicht bringt, wird genau erläutert

                      genauso wie deine Fragen mit dem Absatz beantwortet werden sollten.
                      das mit dem waitfor hab ich aus irgendeiner seite mal aufgegriffn und wollte es einfach ausprobieren. im manual steht es nicht haste recht.

                      ist es also so das wenn einer for update macht dass dann keine mehr selecten kann?

                      auch wenn dieses select for update gleichzeitig passiert?

                      danke euch allen
                      viele grüsse
                      xadine

                      Kommentar


                      • #12
                        Original geschrieben von Xadine
                        ist es also so das wenn einer for update macht dass dann keine mehr selecten kann?
                        Ja, steht doch da...

                        auch wenn dieses select for update gleichzeitig passiert?
                        Es können nicht zwei gleichzeitig abgesetzt werden... das erste akquiriert ein Write-Lock, danach ist der Datensatz gesperrt.

                        Das gilt natürlich nur, wenn die Storage-Engine das auch unterstützt.

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

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

                        Kommentar


                        • #13
                          Original geschrieben von ghostgambler
                          Wo genau steht eigentlich, was NOWAIT macht - und vor allem, dass MySQL das überhaupt könnte?
                          Ich finde nämlich dazu rein gar nichts im Manual...

                          Was hingegen "FOR UPDATE" bringt oder nicht bringt, wird genau erläutert

                          genauso wie deine Fragen mit dem Absatz beantwortet werden sollten.
                          das mit dem waitfor hab ich aus irgendeiner seite mal aufgegriffn und wollte es einfach ausprobieren. im manual steht es nicht haste recht.

                          ist es also so das wenn einer for update macht dass dann keine mehr selecten kann?

                          auch wenn dieses select for update gleichzeitig passiert?

                          danke euch allen
                          viele grüsse
                          xadine

                          Kommentar


                          • #14
                            hallo ichkomme wieder nicht weiter,
                            wollte testen ob wirklich gespeert wird.

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

                            $id $_POST['transmit'];

                            $sql=db_connect();



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

                            $result=$sql->query("SELECT * FROM angebot WHERE id='$id' FOR UPDATE");
                            if(!
                            $result)
                            echo(
                            "gesperrt");
                            else
                            echo(
                            "nicht gesperrt");
                            ich commite nicht damit ich mit nem anderen rechner die selbe anfrage starten kann. aber nach dem benutzer A nicht gespeert ausgibt gibt benutzer B das selbe auch aus.
                            Ich habe die Ahnung das es daran liegt das das skript zuende läuft und somit die zeile entsperrt wird? ist das so?
                            weiss auch nicht wie ich die transaction "halten" soll um ein gleichzeitiges select zu simulieren.


                            könnt ihr mir nochmal helfen?
                            viele grüsse
                            Xadine

                            Kommentar


                            • #15
                              Ja das ist so und sleep() hilft dagegen.

                              Kommentar

                              Lädt...
                              X