Dve relácie, jeden identifikátor
Dva behy pridelili to isté číslo záznamu v rozstupe niekoľkých minút, pretože obidva čítali ďalšie číslo z hlavičky namiesto z dát.
Dve súbežné relácie zapísali záznamy pod tým istým identifikátorom v priebehu niekoľkých minút. Obe si vzali ďalšie číslo zo súhrnného riadku na začiatku súboru namiesto z najvyššieho čísla, ktoré sa v ňom skutočne nachádzalo. Prideľovanie identifikátora z uloženého (cachovaného) počtu namiesto z aktuálneho maxima sa rozbije vo chvíli, keď čokoľvek beží paralelne.
Vzor
Záznamy v evidencii sú číslované postupne. Ak chcete pridať nový, prečítate hlavičku — najvyššie ID: 51 — a zapíšete 52.
Dva behy to urobia s odstupom niekoľkých minút. Obidva zapíšu 52. Jedna evidencia tak nakoniec obsahovala 34 blokov záznamov pod 33 unikátnymi identifikátormi. Jeden identifikátor teraz ukazuje na dve rôzne zistenia a každý odkaz naň je nejednoznačný.
Prečo to vyzerá správne
Hlavička existuje presne preto, aby nikto nemusel prehľadávať celý súbor. Jej čítanie je rýchlejšie a v okamihu zápisu bola správna.
Pri jednovláknovom behu to funguje roky. Chyba je neviditeľná, kým niečo nebeží dvakrát naraz — a dovtedy sa tento postup stihne zaužívať všade.
Prečo to zlyháva
Hlavička je cache faktu, ktorý žije v tele súboru. Každé čítanie z cache bez zámku na zápis je pretekom (race condition) a jeho okno je rovnako dlhé ako medzera medzi čítaním a zápisom — čo je pri procese riadenom človekom skôr minúty než milisekundy.
Náprava je tá nákladná časť. Prečíslovanie čerstvého duplikátu je mechanická záležitosť. Prečíslovanie starého záznamu znamená nájsť každý krížový odkaz v každom inom súbore, ktorý dané číslo cituje — a ak sa čo i len jeden odkaz prehliadne, ticho ukazuje na nesprávny záznam.
Namiesto toho
Prideľujte z aktuálneho maxima, nie zo súhrnu. Tesne pred zápisom vyhľadajte (grep) v tele súboru najvyšší identifikátor:
grep -o '^### CTRL-[0-9]*' ledger.md | sort | tail -1
Oplatia sa ešte dve ďalšie pravidlá. Robte identifikátory lacno unikátnymi — časová pečiatka alebo krátka náhodná prípona pretek úplne odstráni, za cenu menej elegantného výsledku. A keď duplikát nájdete, opravte ten mladší a starý iba označte: mladý záznam ešte nemá žiadne prichádzajúce odkazy, starý ich môže mať mnoho, a mechanické prečíslovanie starého mení viditeľnú kolíziu na súbor tichých zavádzajúcich odkazov.
$ head -12 two-sessions-one-id.md
$ cite two-sessions-one-id
Citation id SV-4434 is stable. It resolves at
https://stillvalid.dev/sk/c/SV-4434 even if this artifact moves to another section,
which a bare URL does not survive. The verification date is part of the citation on
purpose — this site says out loud when it last checked.
[Dve relácie, jeden identifikátor](https://stillvalid.dev/sk/patterns/two-sessions-one-id) — stillvalid, SV-4434 (anti-pattern, verified 2026-08-14)