Transactions and concurrency - Controlling concurrent access - Optimistic concurrency control
8 belangrijke vragen over Transactions and concurrency - Controlling concurrent access - Optimistic concurrency control
Hoe detecteer je conflicten met versioning ?
Let op de SQL-statements, met name de UPDATE en de WHERE-clausule. Deze update zal alleen succesvol zijn als er een rij met VERSION = 0 in de database staat. JDBC retourneert het aantal bijgewerkte rijen aan Hibernate; als dit resultaat nul is, betekent dit dat de ITEM-rij ofwel verdwenen is of niet langer versie 0 heeft. Hibernate detecteert dit conflict tijdens het flushen, en er wordt een javax.persistence.OptimisticLockException gegenereerd.
Daarom wint de eerste commit en kunnen we de OptimisticLockException opvangen en er specifiek mee omgaan.
Welke aanpassingen veroorzaken een verhoging van de versie van de entiteit ?
Hoe kunnen we de een eigenschap van een entiteit uitsluiten voor versioning?
- Hogere cijfers + sneller leren
- Niets twee keer studeren
- 100% zeker alles onthouden
Welke tijdeigenschappen kunnen we gebruiken met Hibernate ?
Welke tijdeigenschap kunnen we gebruiken met JPA ?
Hoe werkt automatische versioning ?
Dit controleert de huidige databasestatus ten opzichte van de ongewijzigde waarden van persistente eigenschappen op het moment dat Hibernate de instantie van de entiteit ophaalde (of de laatste keer dat de persistentiecontext werd geüpdatet).
Je kunt deze functionaliteit inschakelen met de Hibernate-annotatie @org.hibernate.annotations.OptimisticLocking:
Voor deze strategie moet je ook de dynamische SQL-generatie van UPDATE-opdrachten inschakelen, met behulp van @org.hibernate.annotations.DynamicUpdate
Welke OptimisticLockTypes zijn er en hoe verschillen ze ?
OptimisticLockType.ALL : Hibernate vermeldt alle kolommen en hun laatst bekende waarden in de WHERE-clausule. Als een gelijktijdige transactie een van deze waarden heeft gewijzigd of zelfs de rij heeft verwijderd, retourneert deze opdracht nul bijgewerkte rijen. Hibernate gooit dan een uitzondering bij het flushen.
OptimisticLockType.DIRTY : Hibernate detecteert een conflict alleen als ze beide dezelfde waardegetypeerde eigenschap wijzigen (of een waarde van een externe sleutel). De WHERE-clausule van het laatste SQL-fragment zou worden gereduceerd tot waar ID = 123 en NAAM = 'Oude Naam'
Alleen als de applicatie gelijktijdig de naam heeft gewijzigd, krijgen we een javax.persistence.OptimisticLockException.
Hoe maak je in een individuele JPA Query de lezingen herhaalbaar?
em.createQuery ....
.setLockMode(LockModeType.OPTIMISTIC)
Voor elk eerder geladen Item met de vergrendelingsquery voert Hibernate tijdens het flushen een SELECT-query uit. Het controleert of de databaseversie van elke ITEM-rij nog steeds hetzelfde is als toen deze werd geladen. Als een ITEM-rij een andere versie heeft of de rij bestaat niet meer, wordt een OptimisticLockException gegenereerd.
Hibernate batcht of optimaliseert de SELECT-statements voor handmatige versiecontrole niet. Als we bijvoorbeeld 100 items samenvoegen, krijgen we 100 extra queries bij het flushen.
De vragen op deze pagina komen uit de samenvatting van het volgende studiemateriaal:
- Een unieke studie- en oefentool
- Nooit meer iets twee keer studeren
- Haal de cijfers waar je op hoopt
- 100% zeker alles onthouden