Bonjour,
Je veux (par exemple) tester si une personne existe déjà dans la base de données avant de l'insérer. Admettons que l'on fasse ce test par rapport au nom de la personne. On est dans une application multi-utilisateur.
Je fais une transaction SQL dans une procédure stockée.
pseudo code :
1) Début Transaction
2) declaration de @nbDoublon
3) SELECT @nbDoublon = COUNT(*) FROM t_personne WHERE personne_nom='quelquun';
4) IF @nbDoublon = 0 INSERT etc...
5) Fin transaction
Voici ma question :
Si j'utilise l'isolation par défaut de SQL-SERVER (read commited) est ce qu'il n'y a pas un risque qu'entre l'étape 3 et 4 une requête concurrente s'insère et que donc j'insère un doublon ?
En effet, le mode read commited ne vérouille pas les SELECT
Faut il passer par un verouillage serializable ?
N'y a t'il pas une autre solution ?
- par exemple faire la verif dans la même instruction INSERT..
- executer le select, le if et le insert via un sp_executesql (les intructions d'un sp_executesql sont ils exécutés en une seule fois cad pas de risque de requêtes concurrentes qui s'insèrent entre ses instructions ?)
Si je passe par une transaction serializable, y a pas de soucis ? (à priori non mais ça fait toujorus peur ce genre de transactions)
Partager