Bases des bases de données
La quantité en stock d'un produit dans une table Stock vaut 10. La transaction T1 lit la quantité en stock et réécrit cette valeur moins 3, et T2 lit la quantité en stock et réécrit cette valeur moins 5. Si elles s'exécutent sans poser de verrou, dans l'ordre lecture de T1, lecture de T2, écriture de T1, écriture de T2, quelle est la quantité en stock finale ?
- A2
- B5
- C7
Afficher la réponse et l'explication
Réponse : B. 5
T1 et T2 lisent toutes deux la quantité en stock de 10 avant que l'autre n'ait écrit. T1 écrit 10 − 3 = 7, mais T2 l'écrase ensuite avec 10 − 5 = 5, calculé à partir du 10 qu'elle a lu ; la quantité finale est donc 5. Elle aurait dû être 10 − 3 − 5 = 2, le résultat de l'exécution des 2 opérations l'une après l'autre ; la mise à jour de T1 a été perdue. C'est ce qu'on appelle une mise à jour perdue (lost update). Pour l'éviter, on peut soit poser un verrou exclusif lors de la lecture afin que la lecture de T2 attende la fin de T1 (par exemple avec SELECT … FOR UPDATE), soit effectuer la lecture et l'écriture dans une seule instruction SQL, comme UPDATE Stock SET Quantite = Quantite - 3.
Continuer : 9 autres questions sur Bases des bases de données