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")
}
Par conséquence,
- Lorsque Bob voudra accéder à la ligne il doit attendre que le verrou soit levé
- Donc lorsqu’il fera explicitement son
SELECTil aurastock=0 - Donc le test en java
if(qty<0)échoue