Real Time Problematik

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

  • Real Time Problematik

    Hallo,

    folgendes Szenario:

    Geht um ne Art MArktplatz:

    Person A und B klicken von ihren Rechnern beinahe Zeitgleich auf einen Posten den sie damit "sofort" kaufen.

    Problem: Es kam nun öfter vor, dass beide Personen das Produkt bekommen haben!!! Weil Person B den Kaufquery noch ausführt bevor Person A beim delete angekommen ist um den Datensatz zu löschen. Ziemlicher Mist den ich da gerade erfahre

    Dann dachte ich mir:

    Jener der schneller ist, trägt seine ID und den Posten in die DB ein, nur wenn meine ID in der DB steht, kann ich diesen dann auch kaufen und ist für Person B gesperrt. Denkst, denn wenn der Eintrag von Person A nicht schneller in der DB ist, als Person B am Check angelangt ist, ists dasselbe Resultat. Blöd!

    Nun dachte ich mir:

    Den eben beschriebenen Check in einer Schleife laufen lassen (so 100x)... Dann sollte es doch engültig möglich sein das "wirklich" nur einer den Posten bekommt?? Habe das noch nicht ausprobiert, aber denke theoretisch eine "sichere" Methode?

    Ich brauche echt kreative Köpfe die mir eine Idee geben können, wie ich dieses Problem beheben kann ohne auf das "Ein Klick - Sofort kaufen" zu verzichten.

    Nein ich will keine Auktion programmieren, sondern meinen Marktplatz meines Onlinegames sicher machen..... Is schon ne Art Bugusing dadurch entstanden:/

    Wenn 100 Leute einen Posten wollen, bekommen meisten 3 das Produkt ins Lager .... Hoffe jemand kann mir einen Denkanstoss geben.

    Danke ^^
    Maikel

  • #2
    Wie wäre es denn erst das zuerst noch einmal ein 'select' zu machen ob der Artikel noch frei ist - wenn nicht dann Fehlermeldung oder so, dann das 'delete' und zuletzt den 'insert' als Kaufquery
    require_once('gehirn_v_02beta.php');

    Kommentar


    • #3
      hmm,

      vielleicht hilft dir das
      http://dev.mysql.com/doc/mysql/de/Tr..._Commands.html
      Die Zeit hat ihre Kinder längst gefressen

      Kommentar


      • #4
        Original geschrieben von derHund
        hmm,

        vielleicht hilft dir das
        http://dev.mysql.com/doc/mysql/de/Tr..._Commands.html
        Hi danke,

        is schonmal ein Ansatz, aber die ganze Tabelle sperren wäre nicht so optimal, dann kann ja nur ein Spieler zur Zeit auf dem Markt kaufen .... Einen einzelnen Eintrag in der Tabelle sperren wäre was... *such* Glaube gibt es aber nicht?!

        Kommentar


        • #5
          So guten Morgen =)

          bin auch weiterhin für Ideen und Anregungen offen...

          Schönen Tag

          Kommentar


          • #6
            Hallo MaikelCoke

            Noch ein anderer Vorschlag mit dem es sicher funktionieren sollte:
            Eine auto_inc - Spalte kann keine doppelten Werte haben, es ist immer genau einer der erste!


            Du machst zusätzlich eine Tabelle mit:
            Counter integer auto_increment
            BenutzerID
            WarenID

            Sobald einer auf "kaufen" klickt trägt er
            BenutzerID und WarenID ein, Counter wird automatisch gesetzt.

            Die Prüfung:

            1. Position des ersten finden
            [$counter=] select min(counter) as counter from ... where WarenID=$...

            2. Wer ist der erste?
            select BenutzerID from ... where Counter=$counter

            3. Bin "Ich" der erste?
            if ($row['BenutzerID']== MeineID {

            update DeineAlteTable set ... where Gewinner="" and WarenID=... //Gewinner in Deine bestehende Tab eintragen
            delete from ... where WarenID=$WarenID //Tabelle wieder aufräumen


            } else {

            Pech gehabt!

            }

            Kommentar


            • #7
              Hmmnn ... als alter Realtime Hase (InCircuit Emulatoren für X51 und 68hc11 Microcontroller) finde ich also diesen Thread ... und freue mir 'nen Wolf ... und dann schau ich mir das Posting an ... und ... Mist ... geht wieder nur um simple Race-Conditions ... nix Realtime ... ... da frage ich mich doch ... wann ... wenn Ihr schon mit Fachbegriffen um euch werft ... lernt Ihr endlich die richtigen zu verwenden ... ?!
              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


              • #8
                Original geschrieben von goth
                ... und freue mir 'nen Wolf ... und dann schau ich mir das Posting an ... und ... Mist ... geht wieder nur um simple Race-Conditions ... nix Realtime ...
                Realtime in PHP? Eine SCRIPTSPRACHE??
                Das hast Du nicht wirklich geglaubt oder brauchst Du 'nen Kaffee??
                Ich hatte jedenfalls zu viel mit PICs und SPS zu tun um das zu glauben

                Kommentar


                • #9
                  Einen einzelnen Eintrag in der Tabelle sperren wäre was... *such* Glaube gibt es aber nicht?!
                  kenne das auch nur theoretisch, aber laut meinen infos sollte es für deine zwecke passen ... such mal nach ACID speziell das I(solation) sollte das sein, was du brauchst ... wie gesagt, kenne nur die theorie.
                  Die Zeit hat ihre Kinder längst gefressen

                  Kommentar


                  • #10
                    Row Locking gibt's in MyIsam leider nicht, kann man aber "selber" machen:

                    2 Spalten einfügen,
                    lock integer default 0

                    dann versuch:
                    update ... set lock=CONNECTION_ID() where lock=0 and ...

                    dann überprüfen mit
                    select ... from ... where lock=CONNECTION_ID()

                    Da kann es dann aber DEAD LOCKS geben die man eventuell aufräumen muss, eventuell mit neuer Spalte Timestamp

                    Kommentar


                    • #11
                      Row Locking gibt's in MyIsam leider nicht, kann man aber "selber"
                      niemand hatte myISAM vorausgesetzt
                      Die Zeit hat ihre Kinder längst gefressen

                      Kommentar


                      • #12
                        Original geschrieben von fuser
                        Realtime in PHP? Eine SCRIPTSPRACHE??
                        Das hast Du nicht wirklich geglaubt oder brauchst Du 'nen Kaffee??
                        Ich hatte jedenfalls zu viel mit PICs und SPS zu tun um das zu glauben
                        Und ich habe zu viel mit diesem Forum zu tun, als das ich glauben würde, das die User auf anhieb das richtige Forum finden, um über Realtime-Probleme zu diskutieren ... !
                        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

                        Lädt...
                        X