Představme si následující situaci. Ve skladu pracují dva skladníci, každý má svůj terminál. Na skladě je 10 šroubů. Prvý skladník vydá 5 šroubů, druhý skladník 3 šrouby. Oba svůj výdej zapíší řádně do počítače.
Zatímco odpověď na první otázku je jednoduchá - 2 šrouby, odpověď na druhou otázku je poněkud složitější:
A) předpokládejme, že 1. skladník vydal 5 šroubů, výdej řádně zapsal, zůstatek je 5 šroubů, pak 2. skladník vydá 3 šrouby, v evidenci počítače jsou 2 šrouby (správně - obr. ).
B) předpokládejme, že 2. skladník vydal 3 šrouby, výdej řádně zapsal, zůstatek je 7 šroubů, pak 1. skladník vydá 5 šroubů, v evidenci počítače jsou 2 šrouby (správně - obr. ).
C) předpokládejme, že 1. skladník se podíval do databáze, zjistil, že na skladu je 10 šroubů, druhý udělal totéž, pak první skladník odepsal 5 šroubů, v databázi je 5 šroubů, ale na obrazovce 2. skladníka je stále ještě 10 šroubů, on odepíše 3, a zapíše do databáze 7 šroubů (chybně - obr. ).
D) předpokládejme, že 1. skladník se podíval do databáze, zjistil, že na skladu je 10 šroubů, druhý udělal totéž, pak druhý skladník odepsal 3 šrouby, v databázi je 7 šroubů, ale na obrazovce 2. skladníka je stále ještě 10 šroubů, on odepíše 5, a zapíše do databáze 5 šroubů (chybně - obr. ).
Jedná se o programátorskou chybu. Jaké je řešení?
Většinou lze zajistit, aby si při víceuživatelském přístupu uživatelé rozdělili kompetence (jeden skladník vydává šrouby a druhý hřebíky). Toto řešení však sníží možnost kolizí, ale nemůže je zcela vyloučit (nemožnost rozdělení, chyba uživatele).
V okamžiku, kdy je proveden dotaz a očekává se změna dat, tak se všechny záznamy, které vstupují do dotazu, zamknou. Další pokusy jiných uživatelů pracovat nad stejnými záznamy se buď odmítnou a těmto uživatelům se zobrazí zpráva, že data jsou uzamčená, nebo další uživatelé musí čekat na odemčení bez zprávy. Až je dokončeno zpracování pro uživatele, který data požadoval jako první, jsou příslušné datové záznamy odemčeny.
Zamykání záznamů může mít dva nepříjemné důsledky:
Obecně by se mělo provádět uzamčení jen na nezbytně dlouhou dobu. Ideální je pouze na provádění změny počítačem. V případě rezervace letenek např. po dobu, kdy zákazník hovoří s prodejcem.
V tomto případě se záznamy nezamykají. Každý záznam je interně označen tzv. časovým razítkem (může to být i čítač, kolikrát byl daný záznam změněn). V okamžiku, kdy se má zapisovat do databáze, program se pokusí celou databázi zamknout. Pokud se to nepodaří, čeká (uzamčení trvá jen po dobu zápisu dat, typicky zlomky sekundy - není v něm zahrnuta doba, kdy uživatel si prohlíží databázi). Jakmile databázi zamkne, provede se opětné interní čtení a porovnává se, zda se nezměnilo časové razítko. Pokud ne, data se zapíší, jinak se vydá uživateli zpráva, že má kolizi s někým jiným a že musí svůj dialog zopakovat. Protože je velmi málo pravděpodobné, že dva uživatelé pracují nad stejnými záznamy, dochází ke kolizi jen velice zřídka, kolize se nepromítne do dat a mechanismus zabezpečení zaručuje integritu dat.