Yleisiä väärinkäytön tilanteita: Estääksemme tilausten päällekkäiset maksut, jotka johtuvat käyttäjien vahingossa painamasta maksupainiketta useaan kertaan, käytämme lukkoa (tilausnumero) varmistaaksemme, että vain yksi säie saa suorittaa tilauksen toiminnon.
Tämä idea on hyvä, ainakin parempi kuin lock (yksityinen staattinen objekti luokkien käsittelyyn), koska lukumääränumeron lukitsemisen vaikutus on lukita vain nykyisen yhden järjestyksen operaation, ja jos lukitsee staattisen muuttujan, eli lukita kaikki tilaukset, kaikki tilaukset jonotetaan, mikä on ilmiselvästi kohtuutonta.
Voiko artikkelin alussa mainittu lukitusmenetelmä (tilausnumero) saavuttaa halutun tuloksen? Käytetään ensin koodia käyttötilanteen palauttamiseen.
Jos jätät käyttäjätiedot ja muut validointitiedot huomiotta, koodi näyttää käytännössä tältä:
Lukon avainsanasta MSDN sisältää tietoa, joka löytyy Baidusta, ja näyttää siltä, että lock(string)-sanaa ei suositella, ja syy on sama. Seuraava kohta on otettu MSDN:n neuvosta lukkokielistä:
Lock("myLock") -ongelma johtuu siitä, että mikä tahansa muu koodi, joka käyttää samaa merkkijonoa prosessissa, jakaa saman lukon. Tämä lause kätkee suuren mekanismin, nimittäin "saman merkkijonon".
Mitä tarkoittaa "sama lanka"? Katso koodi:
Ovatko str1 ja str2 sama kieli yllä mainittuna? Vastaus on KYLLÄ.
Katso uudelleen:
Ovatko str1 ja str2 yläpuolella edelleen sama kieli? Vastaus on EI.
Okei, palataan tilausmaksun asiaan. Koodissamme lock(orderNumber), kun käyttäjä vahingossa klikkaa muutaman kerran pyyhkäistyään kättään, onko orderNumber joka kerta sama merkkijono, kun hän syöttää tämän toiminnon? Vastaus on EI. Tämä tarkoittaa
Koodi, joka käsittelee yllä olevan järjestyksen, ei oikeasti toimi lukkona.
Itse asiassa on olemassa kahta tyyppiä merkkijonojen vertailuja, katso koodi:
Yllä olevan koodin ensimmäinen rivi tuottaa True-arvon ja toinen rivi False-arvon. Uskon, että ymmärrät, mitä MSDN tarkoittaa "samalla langalla" ilman selitystäni.
Paras ratkaisu
Ratkaisuja optimaalisiin lukittuviin kieliin:
Demokoodi:
Verkkosivustolla joskus voidaan käyttää globaalia muuttujaa, ja tämä globaali muuttuja, kun useampi käyttäjä käyttää niitä samanaikaisesti, voi vaikuttaa epänormaalilta, jolloin asetamme globaalin lukon, mutta haittapuolena on, että kaikki pääsyt odottavat vuorollaan.
Joissain tapauksissa, esimerkiksi sama käyttäjä voi kommentoida vain kerran 15 sekunnin sisällä, ja jos globaalia lukitusta käytetään, kommentointitoiminto käsittelee hyvin hitaasti, kun käyttäjämäärä kasvaa, mikä vaikuttaa merkittävästi käyttäjäkokemukseen.
Tällä hetkellä,Voimme asettaa lukon jokaiselle käyttäjälle erikseen, lock(string){...}, ja lukon nimi voidaan määritellä seuraavasti:Metodin nimi + käyttäjän IDNäin jokaisella käyttäjällä on itsenäinen lukitus, ja kommenttiväliä arvioitaessa se ei vaikuta muiden käyttäjien kommentteihin.
(Loppu)
|