Pesimistický zámek řádků: jak e-shop s unikátními kusy zboží řeší race condition
Bazarový e-shop prodává kusy, které existují jen jednou. Dva zákazníci nesmí koupit ten samý kus zboží současně — řešení není v aplikační logice, ale v databázi.
Klasický e-shop se skladovými zásobami řeší souběžné objednávky jednoduše — sníží počet kusů na skladě, a pokud dojde na nulu, další objednávka selže. U bazaru s unikátními kusy zboží je situace jiná: každá položka existuje přesně jednou. Dva zákazníci, kteří si ji vloží do košíku ve stejnou vteřinu, představují race condition, který obyčejná kontrola "je skladem?" nezachytí spolehlivě.
Proč kontrola v aplikaci nestačí
Typický (chybný) postup: aplikace se zeptá databáze "je zboží dostupné?", dostane odpověď "ano", a pak ho rezervuje. Mezi dotazem a rezervací je ale časové okno — pokud se v něm stihne vejít druhý zákazník se stejným dotazem, oba dostanou odpověď "ano" a oba si myslí, že zboží mají. Tohle okno může být jen pár milisekund, ale při dostatečném provozu nastane.
Řešení na úrovni databáze
Fotobazoš.cz řeší tohle přesně tam, kde to řešit má — v databázové transakci se zámkem řádků (`SELECT … FOR UPDATE`). Jakmile jeden zákazník zboží zamkne, druhý dotaz na stejný řádek čeká, dokud se první transakce neuzavře. Není to hlídání v aplikační logice, které se dá obejít špatným pořadím operací — je to garance na úrovni databázového enginu.
Proč na tom záleží byznysově
Prodaný kus, který ve skutečnosti neexistuje, znamená reklamaci, ztrátu důvěry a ruční řešení dvou naštvaných zákazníků místo jednoho spokojeného. U byznysu postaveného na unikátních kusech není tahle jistota technický detail navíc — je to základní podmínka, aby model vůbec fungoval.
Případová studie
Fotobazoš.cz
Zobrazit případovou studii →