Bieži sastopami ļaunprātīgas izmantošanas scenāriji: Lai novērstu pasūtījumu dublēšanos, ko izraisa lietotāji nejauši noklikšķinot uz maksājuma pogas vairākas reizes, mēs izmantojam bloķēšanu (pasūtījuma numuru), lai nodrošinātu, ka tikai viens pavediens ir atļauts veikt darbību ar pasūtījumu.
Šī ideja ir laba, vismaz labāka par bloķēšanu (privāts statisks objekts apstrādes klasēm), jo bloķēšanas pasūtījuma numura efekts ir bloķēt tikai pašreizējā 1 pasūtījuma darbību, un, ja bloķēšanas statiskais mainīgais, tas ir, bloķēt visus pasūtījumus, izraisīs visu pasūtījumu rindu, kas ir acīmredzami nepamatoti.
Tātad, vai šī raksta sākumā minētā bloķēšanas (pasūtījuma numura) metode var sasniegt vēlamo efektu? Vispirms izmantosim kodu, lai atjaunotu lietošanas scenāriju.
Ja ignorējat lietotāja informāciju un citas validācijas, kods izskatās gandrīz šādi:
Bloķēšanas atslēgvārdam MSDN ietver informāciju, ko var atrast Baidu, un šķiet, ka nav ieteicams izmantot lock(string), un iemesls ir tāds pats. Šis fragments ir ņemts no MSDN ieteikumiem par bloķēšanas virknēm:
Bloķēšanas ("myLock") problēma rodas, jo jebkurš cits kods, kas procesā izmanto to pašu virkni, koplieto to pašu slēdzeni. Šis teikums slēpj milzīgu mehānismu, tas ir, "to pašu virkni".
Kas ir "viena un tā pati virkne"? Skatīt kodu:
Vai str1 un str2 ir viena un tā pati virkne iepriekš? Atbilde ir JĀ.
Skatīt vēlreiz:
Vai str1 un str2 iepriekš joprojām ir viena un tā pati virkne? Atbilde ir NĒ.
Labi, atgriezīsimies pie jautājuma par mūsu pasūtījuma apmaksu. Mūsu kodā lock(orderNumber), kad lietotājs nejauši noklikšķina vēl dažas reizes pēc rokas pavilkšanas, vai pasūtījuma numurs, kas ievada šo darbību, katru reizi ir viena un tā pati virkne? Atbilde ir NĒ. Tas nozīmē, ka
Kods, kas apstrādā iepriekš minēto pasūtījumu, faktiski nedarbojas kā slēdzene.
Faktiski ir divu veidu virkņu salīdzinājumi, skatiet kodu:
Iepriekš minētā koda pirmā rinda izvada True, bet otrā rinda izvada False. Es domāju, ka jūs saprotat, ko MSDN nozīmē ar "to pašu virkni" bez mana paskaidrojuma.
Labākais risinājums
Risinājumi optimālām bloķēšanas auklām:
Demo kods:
Tīmekļa vietnē dažreiz var tikt izmantots globāls mainīgais, šis globālais mainīgais, kad vairāki lietotāji vienlaikus piekļūst, var šķist nenormāls, šobrīd mēs iestatīsim globālo bloķēšanu, bet trūkums ir tas, ka visas piekļuves gaidīs pēc kārtas.
Dažos scenārijos, piemēram, viens un tas pats lietotājs var komentēt tikai vienu reizi 15 sekunžu laikā, ja tiek izmantota globālā bloķēšana, komentāru funkcija būs ļoti lēna, kad lietotāju skaits palielināsies, kas ievērojami ietekmēs lietotāja pieredzi.
ŠobrīdMēs varam iestatīt bloķēšanu katram lietotājam atsevišķi, lock(string){...}, un slēdzenes nosaukumu var definēt kā:Metodes nosaukums + lietotāja IDTādā veidā katram lietotājam ir neatkarīga bloķēšana, un, spriežot par komentāru intervālu, tas neietekmēs citu lietotāju komentārus.
(Beigas)
|