Synchronizaci na úrovni Javy bych nedělal – kdybyste synchronizoval celou metodu, budou na sebe volání čekat, i když budete upravovat různé dokumenty. Ale hlavně by konkurenční přístup neměl být závislý na tom, že do databáze zapisuje jediná aplikace. Když bude aplikace víc využívaná, nebude aplikační server stíhat a budete ho chtít spustit ve více instancích na různých serverech – a rázem by vám veškerá řešení konkurenčního přístupu v aplikaci přestala fungovat. (Je mi jasné, že to asi nebude případ vaší aplikace, ale nedává smysl učit se to dělat špatně.)
Tohle se řeší pomocí zamykání na úrovni databáze. Buď pomocí pesimistický zámků, kdy ty záznamy opravdu zamknete (pomocí SELECT … FOR UPDATE) a ostatní transakce budou čekat na jejich uvolnění. U takovýchhle aplikací je ale daleko lepší použít optimistické zamykání – předpokládá se, že většinou ke konfliktu nedojde, takže se nezamyká, ale při zápisu se kontroluje, zda mezi tím nedošlo ke změně. A řeší se to teprve ve výjimečném případě, kdy ke změně došlo.
Optimistické zamykání se dělá tak, že u databázového záznamu máte uložené i označení jeho verze. Může to být čítač, který se s každým zápisem zvýší o jedničku, může to být třeba časové razítko poslední změny záznamu. Když načítáte data, načtete i to číslo verze, a když pak záznam aktualizujete, přidáte do WHERE podmínky tu verzi. Pokud by jiná transakce záznam mezi tím změnila, porovnání čísla verze nebude sedět a UPDATE proběhne „na prázdno“ – nezaktualizuje se žádný záznam. Podle toho poznáte, že v databázi jsou novější data a musíte požadovanou operaci provést znovu nad těmi novějšími daty. Má to tu výhodu, že to číslo verze můžete protáhnout až k uživateli do webové aplikace. Uživatel tak může mít záznam rozeditovaný klidně několik hodin, ten záznam není na serveru zamčený, takže neblokuje ostatní – a až se po několika hodinách rozhodne, že data uloží, jenom se podle čísla verze zkontroluje, že se mezi tím v databázi nic nezměnilo. Pokud se něco změnilo, nebudou čísla verzí souhlasit a musí se to vyřešit – buď uživateli načtete aktuální data z databáze a necháte ho jím provedené změny udělat znovu, nebo mu můžete zobrazit aktuální verzi a jeho změny, a nechat ho ty jeho změny zapracovat do té aktuální verze na serveru.