En fait, les transactions ne vous sont pas vraiment utiles ici ... sauf si vous voulez que des transactions s'exécutent sur plusieurs requêtes HTTP (ce que vous ne voulez probablement pas).
Ce que nous utilisons généralement dans ces cas, c'est le "Verrou optimiste". L'ORM Django ne prend pas en charge cela autant que je sache. Mais il y a eu des discussions sur l'ajout de cette fonctionnalité.
Donc, vous êtes seul. Fondamentalement, ce que vous devriez faire est d'ajouter un champ "version" à votre modèle et le transmettre à l'utilisateur sous forme de champ caché. Le cycle normal pour une mise à jour est :
- lire les données et les montrer à l'utilisateur
- l'utilisateur modifie les données
- l'utilisateur envoie les données
- l'application les enregistre dans la base de données.
Pour implémenter le verrou optimiste, lorsque vous enregistrez les données, vous vérifiez si la version que vous avez reçue de l'utilisateur est la même que celle dans la base de données, puis mettez à jour la base de données et incrémentez la version. Si elles ne le sont pas, cela signifie qu'il y a eu une modification depuis le chargement des données.
Vous pouvez le faire avec un seul appel SQL avec quelque chose comme :
UPDATE ... WHERE version = 'version_de_utilisateur';
Cet appel mettra à jour la base de données uniquement si la version est toujours la même.