|
|
Geplaatst op 03-07-2019 15:25:19
|
|
|
|

Veelvoorkomende misbruikscenario's: Om dubbele betaling van bestellingen te voorkomen, veroorzaakt door gebruikers die per ongeluk meerdere keren op de betaalknop klikken, gebruiken we lock (ordernummer) om ervoor te zorgen dat slechts één thread de bewerking op de order mag uitvoeren.
Dit idee is goed, in ieder geval beter dan lock (een privé statisch object voor het verwerken van klassen), omdat het effect van het lockordernummer is dat alleen de werking van de huidige 1 order wordt vergrendeld, en als een statische variabele lock alle orders bevat, zal het ervoor zorgen dat alle orders in de wachtrij worden gezet, wat uiteraard onredelijk is.
Kan de lock (ordernummer) methode die aan het begin van dit artikel wordt genoemd het gewenste effect bereiken? Laten we eerst wat code gebruiken om het gebruiksscenario te herstellen.
Als je gebruikersinformatie en andere validaties negeert, ziet de code er ongeveer zo uit:
Voor het slotsleutelwoord bevat MSDN informatie die op Baidu te vinden is, en het lijkt erop dat het wordt aanbevolen om geen lock (string) te gebruiken, en de reden is hetzelfde. De volgende passage is afkomstig uit het advies van MSDN over lockstrings:
Het lock("myLock")-probleem ontstaat omdat elke andere code die dezelfde string in het proces gebruikt, dezelfde lock deelt. Deze zin verbergt een enorm mechanisme, namelijk "dezelfde string".
Wat is "dezelfde snaar"? Zie de code:
Zijn str1 en str2 dezelfde snaar hierboven? Het antwoord is JA.
Zie nog eens:
Zijn str1 en str2 hierboven nog steeds dezelfde snaar? Het antwoord is NEE.
Oké, laten we teruggaan naar de kwestie van de betaling van onze bestelling. In onze code, lock(orderNumber), wanneer de gebruiker per ongeluk nog een paar keer klikt na het vegen van zijn hand, is het orderNumber dat deze actie invoert elke keer dezelfde string? Het antwoord is NEE. Dit wil zeggen
De code die bovenstaande volgorde afhandelt, werkt eigenlijk niet als een slot.
Er zijn namelijk twee soorten stringvergelijkingen, zie de code:
De eerste regel van bovenstaande code geeft True uit, en de tweede regel geeft False uit. Ik geloof dat je begrijpt wat MSDN bedoelt met "dezelfde snaar" zonder mijn uitleg.
De beste oplossing
Oplossingen voor optimale locking strings:
Democode:
Op de website kan soms een globale variabele worden gebruikt; deze globale variabele kan abnormaal lijken wanneer meerdere gebruikers tegelijk toegang hebben; op dat moment stellen we een globale vergrendeling in, maar het nadeel hiervan is dat alle toegangswegen om de beurt wachten.
In sommige scenario's kan dezelfde gebruiker bijvoorbeeld slechts één keer binnen 15 seconden reageren; als de globale vergrendeling wordt gebruikt, zal de commentaarfunctie erg traag verwerken wanneer het aantal gebruikers stijgt, wat de gebruikerservaring sterk zal beïnvloeden.
Op dit moment,We kunnen het slot voor elke gebruiker afzonderlijk instellen, lock(string){...}, en de naam van het slot kan worden gedefinieerd als:Methodenaam + gebruikers-IDOp deze manier heeft elke gebruiker een onafhankelijke vergrendeling, en bij het beoordelen van het reactie-interval beïnvloedt dit de reacties van andere gebruikers niet.
(Einde)
|
Vorig:MFC's LPSTR-typeschriftVolgend:OpenSSL is duidelijk bijgewerkt, Apache geeft nog steeds de oude versie aan?
|