Kan iemand me uitleggen of we lente gebruiken voor het transactiebeheer, hoe gelijktijdige updates worden afgehandeld door slaapstand (automatisch versiebeheer van slaapstand in het geheugen) of dat ik een versiekolom in de database moet plaatsen om gelijktijdige updates handmatig te verzorgen.
Of u Spring nu gebruikt voor transactiebeheer of niet, het maakt niet echt uit en is niet relevant als het gaat om gelijktijdigheidsbeheer, dit wordt eigenlijk afgehandeld door Hibernate. Hibernate kan 2 strategieën gebruiken om gelijktijdige updates af te handelen:optimistische vergrendeling en pessimistische vergrendeling.
Optimistisch
Wanneer u optimistische vergrendeling gebruikt, wijst u een speciaal kenmerk (een getal, een tijdstempel) toe als een versie (je hebt er dus eigenlijk een column voor). Deze versie wordt gelezen wanneer u een entiteit ophaalt en opgenomen in de waar-clausule tijdens een update en verhoogd door Hibernate.
Om te illustreren hoe dit werkt, stellen we ons voor dat u een persoonsentiteit laadt met id=1 en met een huidige versie=1. Na een opslag zal Hibernate zoiets als dit uitvoeren:
update PERSON set ID=1, NAME='NAME 1', VERSION=2 where ID=1 and VERSION=1;
Dus stel je nu voor dat je twee gelijktijdige transacties hebt die elk dezelfde . laden entiteit (zelfde versienummer) en de naam wijzigen.
Laten we zeggen dat transactie #1 als eerste wordt vastgelegd, de volgende query wordt uitgevoerd:
update PERSON set ID=1, NAME='NAME 1', VERSION=2 where ID=1 and VERSION=1;
Het lukt en de versie wordt verhoogd.
Vervolgens wordt transactie #2 vastgelegd, de volgende query wordt uitgevoerd:
update PERSON set ID=1, NAME='NAME 2', VERSION=2 where ID=1 and VERSION=1;
Deze zal niets bijwerken omdat de where-clausule met geen enkele record overeenkomt. Dit is waar je een optimistische gelijktijdigheidsuitzondering krijgt.
Deze strategie is geschikt wanneer u de verbinding niet onderhoudt, wanneer gelijktijdige toegang niet frequent is, en zeer goed schaalt. En alles wordt natuurlijk transparant voor je afgehandeld door Hibernate, zolang je maar een versie-attribuut toewijst.
Pessimistisch
Wanneer u pessimistische vergrendeling gebruikt, vergrendelt Hibernate een record voor exclusief gebruik totdat u ermee klaar bent (meestal met een SELECT ... FOR UPDATE
). Elke andere gelijktijdige transactie die toegang probeert te krijgen tot hetzelfde record, wordt opgeschort totdat de vergrendeling wordt verwijderd. Deze strategie biedt een betere voorspelbaarheid, ten koste van de prestaties en schaalt niet oneindig.
Referenties
- Hibernate Core-referentiegids
- 11.3. Optimistische gelijktijdigheidscontrole
- 11.4. Pessimistische vergrendeling