Kan någon förklara för mig om vi använder våren för transaktionshanteringen, hur samtidiga uppdateringar kommer att hanteras av viloläge (I minnet automatisk versionshantering av viloläge) eller så måste jag lägga versionskolumnen i databasen för att ta hand om samtidiga uppdateringar manuellt.
Om du använder Spring för transaktionshantering eller inte spelar egentligen ingen roll och är inte relevant när det kommer till samtidighetshantering, detta hanteras faktiskt av Hibernate. Hibernate kan använda två strategier för att hantera samtidiga uppdateringar:optimistisk låsning och pessimistisk låsning.
Optimistisk
När du använder optimistisk låsning mappar du ett speciellt attribut (ett nummer, en tidsstämpel) som en version (så du har faktiskt en kolumn för det). Denna version läses när du hämtar en enhet och inkluderas i where-satsen under en uppdatering och ökad av Hibernate.
För att illustrera hur detta fungerar, låt oss föreställa oss att du laddar en Person-enhet med id=1 och med en aktuell version=1. Efter en lagring kommer Hibernate att utföra något i stil med detta:
update PERSON set ID=1, NAME='NAME 1', VERSION=2 where ID=1 and VERSION=1;
Så tänk dig nu att du har två samtidiga transaktioner som körs, var och en av dem laddar samma enhet (samma versionsnummer) och ändra namnet.
Låt oss säga att transaktion #1 begås först, följande fråga utförs:
update PERSON set ID=1, NAME='NAME 1', VERSION=2 where ID=1 and VERSION=1;
Det lyckas och versionen ökar.
Sedan genomförs transaktion #2, följande fråga utförs:
update PERSON set ID=1, NAME='NAME 2', VERSION=2 where ID=1 and VERSION=1;
Den här kommer inte att uppdatera någonting eftersom where-satsen inte matchar någon post. Det är här du får ett optimistiskt samtidighetsundantag.
Den här strategin är lämplig när du inte upprätthåller anslutningen, när samtidiga åtkomster inte är frekventa och skalas riktigt bra. Och allt hanteras givetvis transparent av Hibernate åt dig, så länge du mappar ett versionsattribut.
Pessimist
När du använder pessimistisk låsning låser Hibernate en post för din exklusiva användning tills du är klar med den (vanligtvis med en SELECT ... FOR UPDATE
). Alla andra samtidiga transaktioner som försöker komma åt samma post kommer att avbrytas tills låset tas bort. Den här strategin ger bättre förutsägbarhet, till priset av prestanda och skalas inte i det oändliga.
Referenser
- Hibernate Core Reference Guide
- 11.3. Optimistisk samtidighetskontroll
- 11.4. Pessimistisk låsning