Ga naar hoofdinhoud
Verborgen page
Deze pagina is verborgen. Zoekmachines indexeren deze niet en alleen gebruikers met een directe link kunnen deze openen.

Oefenquiz week 3 Concurrency, Optimistic Locking in Spring JDBC

Deze oefenquiz is gebaseerd op de FilmFestival-vraag over concurrency.

Klassendiagram

2ff97a307839383db9891f2ec8c1913c

PlantUML broncode voor "Klassendiagram FilmFestival Concurrency"
@startuml
rectangle "Aggregate Dagplanning" {
class Dagplanning <<AR>> {
id: Integer
voegToe(onderdeel: Onderdeel)
}

class Onderdeel <<Value Object>> {
vertoningId: Integer
starttijd: Time
eindtijd: Time
}
}

Dagplanning "1" --> "onderdelen *" Onderdeel
@enduml

Klassendiagram met 2 klasse(n) en 1 relatie(s).

Klassen:

  • Klasse Dagplanning met stereotype AR met:
    • publieke methode 'voegToe', met parameter(s) 'onderdeel' van type Onderdeel, return type void
    • publieke attribuut 'id' van type Integer
  • Klasse Onderdeel met stereotype Value Object met:
    • publieke attribuut 'vertoningId' van type Integer
    • publieke attribuut 'starttijd' van type Time
    • publieke attribuut 'eindtijd' van type Time
    • geen methoden

Relaties:

  • Dagplanning heeft een associatie-relatie met naam 'onderdelen *' met Onderdeel

Voor scenario A, B en C geldt: er is geen optimistic locking (@Version) geimplementeerd.

Waarom kunnen twee gebruikers tegelijk dezelfde dagplanning aanpassen?

  • In deze (fictieve) app kan een dagplanning gedeeld zijn met een vriendengroep.
  • Ook kan een festivalmedewerker namens een bezoeker wijzigingen doen bij hulp aan de balie.
  • En het kan dat dezelfde gebruiker nog een tweede tab open heeft met dezelfde dagplanning.

Scenario A

a665f0bcd209906139c527da65a863db

PlantUML broncode voor "Scenario A"
@startuml
autonumber
actor Bezoeker1
participant controller1 as "dagplanningController:DagplanningController"
participant d1 as "dagplanning:Dagplanning"
participant o1 as "onderdeel:Onderdeel"
database repo as "dagplanningRepository"
participant o2 as "onderdeel:Onderdeel"
participant d2 as "dagplanning:Dagplanning"
participant controller2 as "dagplanningController:DagplanningController"
actor Bezoeker2

Bezoeker1 -> controller1: POST dagplanningen/1/onderdelen (vertoningId: 11)
controller1 -> o1 ** : onderdeel = new Onderdeel(11, 10:00, 12:00)

Bezoeker2 -> controller2: POST dagplanningen/1/onderdelen (vertoningId: 22)
controller2 -> o2 ** : onderdeel = new Onderdeel(22, 14:00, 16:00)

controller2 -> repo: dagplanning = findById(1)
controller2 -> d2: voegToe(onderdeel)

controller1 -> repo: dagplanning = findById(1)
controller1 -> d1: voegToe(onderdeel)
controller1 -> repo: save(dagplanning)

controller2 -> repo: save(dagplanning)
@enduml

Sequentiediagram met 11 deelnemers: Bezoeker1, "dagplanningController van het type DagplanningController", "dagplanning van het type Dagplanning", "onderdeel van het type Onderdeel", "onderdeel van het type Onderdeel", "dagplanning van het type Dagplanning", "dagplanningController van het type DagplanningController", Bezoeker2, o1 **, o2 ** en repo.

Interacties:

  1. Bezoeker1 roept "dagplanningController.POST dagplanningen/1/onderdelen (vertoningId: 11) aan
  2. "dagplanningController roept o1 **.onderdeel = new Onderdeel(11, 10:00, 12:00) aan
  3. Bezoeker2 roept "dagplanningController.POST dagplanningen/1/onderdelen (vertoningId: 22) aan
  4. "dagplanningController roept o2 **.onderdeel = new Onderdeel(22, 14:00, 16:00) aan
  5. "dagplanningController roept repo.dagplanning = findById(1) aan
  6. "dagplanningController roept "dagplanning.voegToe(onderdeel) aan
  7. "dagplanningController roept repo.dagplanning = findById(1) aan
  8. "dagplanningController roept "dagplanning.voegToe(onderdeel) aan
  9. "dagplanningController roept repo.save(dagplanning) aan
  10. "dagplanningController roept repo.save(dagplanning) aan

Deze quiz helpt je toetsen of je de bron echt hebt bekeken/gelezen en begrepen. Zo niet: bekijk/lees de bron opnieuw. Gebruik deze quiz niet als 'gaming' voor de toets; de toetsvragen zijn inhoudelijk anders.

Scenario A: Welke data zit er in de database nadat het sequentiediagram helemaal is doorlopen?

Scenario B

4e38b4030d3c2e980d16da308b022d4b

PlantUML broncode voor "Scenario B"
@startuml
autonumber
actor Bezoeker1
participant controller1 as "dagplanningController:DagplanningController"
participant d1 as "dagplanning:Dagplanning"
participant o1 as "onderdeel:Onderdeel"
database repo as "dagplanningRepository"
participant o2 as "onderdeel:Onderdeel"
participant d2 as "dagplanning:Dagplanning"
participant controller2 as "dagplanningController:DagplanningController"
actor Bezoeker2

Bezoeker1 -> controller1: POST dagplanningen/1/onderdelen (vertoningId: 11)
controller1 -> o1 ** : onderdeel = new Onderdeel(11, 10:00, 12:00)
controller1 -> repo: dagplanning = findById(1)

Bezoeker2 -> controller2: POST dagplanningen/1/onderdelen (vertoningId: 22)
controller2 -> o2 ** : onderdeel = new Onderdeel(22, 14:00, 16:00)

controller2 -> repo: dagplanning = findById(1)
controller2 -> d2: voegToe(onderdeel)
controller2 -> repo: save(dagplanning)

controller1 -> d1: voegToe(onderdeel)
controller1 -> repo: save(dagplanning)
@enduml

Sequentiediagram met 11 deelnemers: Bezoeker1, "dagplanningController van het type DagplanningController", "dagplanning van het type Dagplanning", "onderdeel van het type Onderdeel", "onderdeel van het type Onderdeel", "dagplanning van het type Dagplanning", "dagplanningController van het type DagplanningController", Bezoeker2, o1 **, repo en o2 **.

Interacties:

  1. Bezoeker1 roept "dagplanningController.POST dagplanningen/1/onderdelen (vertoningId: 11) aan
  2. "dagplanningController roept o1 **.onderdeel = new Onderdeel(11, 10:00, 12:00) aan
  3. "dagplanningController roept repo.dagplanning = findById(1) aan
  4. Bezoeker2 roept "dagplanningController.POST dagplanningen/1/onderdelen (vertoningId: 22) aan
  5. "dagplanningController roept o2 **.onderdeel = new Onderdeel(22, 14:00, 16:00) aan
  6. "dagplanningController roept repo.dagplanning = findById(1) aan
  7. "dagplanningController roept "dagplanning.voegToe(onderdeel) aan
  8. "dagplanningController roept repo.save(dagplanning) aan
  9. "dagplanningController roept "dagplanning.voegToe(onderdeel) aan
  10. "dagplanningController roept repo.save(dagplanning) aan

Deze quiz helpt je toetsen of je de bron echt hebt bekeken/gelezen en begrepen. Zo niet: bekijk/lees de bron opnieuw. Gebruik deze quiz niet als 'gaming' voor de toets; de toetsvragen zijn inhoudelijk anders.

Scenario B: Welke data zit er in de database nadat het sequentiediagram helemaal is doorlopen?

Scenario C

b8387daf7ff71443525e74f260f7042c

PlantUML broncode voor "Scenario C"
@startuml
autonumber
actor Bezoeker1
participant controller1 as "dagplanningController:DagplanningController"
participant d1 as "dagplanning:Dagplanning"
participant o1 as "onderdeel:Onderdeel"
database repo as "dagplanningRepository"
participant o2 as "onderdeel:Onderdeel"
participant d2 as "dagplanning:Dagplanning"
participant controller2 as "dagplanningController:DagplanningController"
actor Bezoeker2

Bezoeker1 -> controller1: POST dagplanningen/1/onderdelen (vertoningId: 11)
controller1 -> o1 ** : onderdeel = new Onderdeel(11, 10:00, 12:00)

Bezoeker2 -> controller2: POST dagplanningen/1/onderdelen (vertoningId: 22)
controller2 -> o2 ** : onderdeel = new Onderdeel(22, 14:00, 16:00)

controller1 -> repo: dagplanning = findById(1)
controller1 -> d1: voegToe(onderdeel)
controller1 -> repo: save(dagplanning)

controller2 -> repo: dagplanning = findById(1)
controller2 -> d2: voegToe(onderdeel)
controller2 -> repo: save(dagplanning)
@enduml

Sequentiediagram met 11 deelnemers: Bezoeker1, "dagplanningController van het type DagplanningController", "dagplanning van het type Dagplanning", "onderdeel van het type Onderdeel", "onderdeel van het type Onderdeel", "dagplanning van het type Dagplanning", "dagplanningController van het type DagplanningController", Bezoeker2, o1 **, o2 ** en repo.

Interacties:

  1. Bezoeker1 roept "dagplanningController.POST dagplanningen/1/onderdelen (vertoningId: 11) aan
  2. "dagplanningController roept o1 **.onderdeel = new Onderdeel(11, 10:00, 12:00) aan
  3. Bezoeker2 roept "dagplanningController.POST dagplanningen/1/onderdelen (vertoningId: 22) aan
  4. "dagplanningController roept o2 **.onderdeel = new Onderdeel(22, 14:00, 16:00) aan
  5. "dagplanningController roept repo.dagplanning = findById(1) aan
  6. "dagplanningController roept "dagplanning.voegToe(onderdeel) aan
  7. "dagplanningController roept repo.save(dagplanning) aan
  8. "dagplanningController roept repo.dagplanning = findById(1) aan
  9. "dagplanningController roept "dagplanning.voegToe(onderdeel) aan
  10. "dagplanningController roept repo.save(dagplanning) aan

Deze quiz helpt je toetsen of je de bron echt hebt bekeken/gelezen en begrepen. Zo niet: bekijk/lees de bron opnieuw. Gebruik deze quiz niet als 'gaming' voor de toets; de toetsvragen zijn inhoudelijk anders.

Scenario C: Welke data zit er in de database nadat het sequentiediagram helemaal is doorlopen?

Verdiepingsvragen over volgorde en locking

Deze quiz helpt je toetsen of je de bron echt hebt bekeken/gelezen en begrepen. Zo niet: bekijk/lees de bron opnieuw. Gebruik deze quiz niet als 'gaming' voor de toets; de toetsvragen zijn inhoudelijk anders.

Welke stap markeert het begin van de sectie waarin lost updates kunnen ontstaan?

Wat betekent 'concurrency' in deze lescontext het best?

Welke stap markeert het einde van die sectie?

In scenario B: als je alleen de twee save-stappen omdraait (controller1 save eerst, controller2 save daarna), wat is dan het resultaat?

Welke annotatie gebruik je voor optimistic locking in JPA?

Stel: optimistic locking is goed geimplementeerd. Wat gebeurt er bij twee concurrerende updates op hetzelfde record?

Wat is typisch voor het gedrag zonder optimistic locking in deze scenario’s?