sql >> Database teknologi >  >> RDS >> Mysql

Forhindre samtidige transaktioner i en webapplikation

Jeg er glad for, at du indser, at det kun er en dårlig og midlertidig løsning, og du bør optimere din kode. Glem dine tokens og ting. Den nemmeste og stadig effektive måde er nok at have en eksklusiv fillås på en delt fil pr. operation. Du kan forestille dig dette som et stykke træ, og kun én kan holde id, og kun den, der har det, må tale eller gøre noget.

<?php
    $fp = fopen("/tmp/only-one-bed-available.txt", "w+");

    if (flock($fp, LOCK_EX)) { // do an exclusive lock

         // do some very important critical stuff here which must not be interrupted:
         // sleeping.
         sleep(60);
         echo "I now slept 60 seconds";
        flock($fp, LOCK_UN); // release the lock
    } else {
        echo "Couldn't get the lock!";
    }

    fclose($fp);
?>

Hvis du udfører dette script 10 gange parallelt, vil det tage 10 minutter at afslutte (fordi der kun er én ledig seng!), og du vil se ekkoet "Jeg sov nu..." hvert 60. sekund (ca.).

Dette serialiserer ALLE udførelser af denne kode GLOBALT. Dette er sandsynligvis ikke, hvad du vil have (du vil have det på en per bruger-basis, gør du ikke?) Jeg er sikker på, at du har noget som bruger-ID'er, ellers brug den udenlandske IP-adresse , og har et unikt filnavn for hver bruger:

Du kan også definere et låsefilnavn for en gruppe af operationer. Måske kan brugeren gøre nogle ting parallelt, men kun denne operation giver problemer? Giv det et tag og inkluder det i låsefilnavnet!

Denne praksis er virkelig ikke så slem og kan bruges! Der er kun få måder at gøre det hurtigere på (mysql internals, delte hukommelsessegmenter, serialisering på et højere lag som load balancer...)

Med løsningen postet ovenfor kan du gøre det i din applikation, hvilket sandsynligvis er godt. Du kan også bruge det samme skema i Mysql:http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_get-lock

Men PHP-implementeringen er sandsynligvis nemmere og bedre til dit brug.

Hvis du virkelig vil have en endnu mere elegant løsning, så tjek bare denne funktion http://www.php.net/manual/en/function.sem-get.php



  1. Uventet @@rowcount-adfærd i en UDF i MS SQL 2019

  2. Sådan angives en fane i en postgres frontend COPY

  3. Brug af Oracle® Heterogene Services med to ODBC-datakilder

  4. BIN_TO_NUM() Funktion i Oracle