Как да избегнем дублирани транзакции при залагане
Какво се случва, когато двойната сума се задръсти?
В един свят, където всяка секунда е залог, дублираната транзакция е като болка в гърба – непоносима и изненадваща. Кликваш “Залагай”, задъхваш се от вълнението, а система ти връща два пъти ставката, като резервоар в черен шах.
Причините – къде се крият грешките?
Техническа накъдренина в кеша, два скрипта, взаимна конкуренция, и всичко се размазва в едно цяло. Презареждане на страницата в момент, когато заявката се изпраща, е най-типичният тригер. А когато API‑то и UI‑то говори асинхронно, дори най‑опитният програмист се загубва.
Кеш и сесии – големият клоун
Сесийните токени, съхранени в браузъра, могат да се задържат, а при повторно натискане да се повтори същото действие. Не подценявайте възможността, че кеширането на страницата да поднесе същата форма, само че без индикатор за вече изпратена заявка.
Скоростта на мрежата – невидимият враг
Когато мрежата се затупи, няколко пакета се изпращат на едно място. Златната средина е да се установи таймаут, но в някои случаи таймаутът е по‑дълъг от времето за реакция, така че мрежата просто „двойно“ доставя.
Практически решения – от кода до потребителя
Първо – “дебъунс” на бутона. Когато кликнеш, той се блокира за минимум 2 секунди, а след това се активира отново. Това е елементарна защита, но в борбата с дублиране често спасява деня.
Второ – уникален идентификатор за всяка заявка. Генерира се GUID в момента на клик и се проверява от сървъра, дали вече е получил такъв. Ако е, просто отхвърля и връща съобщение, а не създава нова поръчка.
Трето – верификация на статус преди изпращане. Според mastercardzalaganiya.com последната състояние на залога се проверява в реално време. Ако сървърът е вече обработил, нова заявка се отхвърля.
Четвърто – синхронно поточно предаване. Обновяването на UI след заявка не се върши чрез AJAX, а чрез WebSocket, което позволява непосредствено известяване, че транзакцията е приета.
Пето – логика в бекенда, която сравнява сума, дата и потребител за малък прозорец от време – 5 секунди. Ако се намери съвпадение, счита се за дублирана и се отбелязва.
Какво да кажа на клиентите?
Никой не иска да вижда “Дублирана заявка” в прозореца. Обяснете, че една секунда забавяне в мрежата не трябва да се превежда в двойна печалба. Предупредете ги да изчакат индикатора да изчезне, преди да кликнат отново.
И последното, без да се мотае – поставете в кода си проверка дали последната заявка успя, преди да позволите следваща. Това е вашият щит срещу дублираните транзакции.
