Ressource

Définition

Il part du principe que des conflits sont susceptibles de se produire, il verrouille donc les données de manière préventive avant toute mise à jour.

La première réponse pour notre problème est de positionner verrou lors du SELECT et faire un SELECT ... FOR UPDATE

decreaseStock() {
    int qty = createQuery("Select qty FROM article where id=1 FOR UPDATE"). // SELECT ... FOR UPDATE
 
    if(qty <= 0) { 
        throw new Exception("stock insuffisant") 
    }
 
    createQuery("UPDATE article SET stock = stock - 1") 
}

plocking

Par conséquence,

  1. Lorsque Bob voudra accéder à la ligne il doit attendre que le verrou soit levé
  2. Donc lorsqu’il fera explicitement son SELECT il aura stock=0
  3. Donc le test en java if(qty<0) échoue