Bonjour à tout le monde !
J'ai lu l'excellent article de SQLPro concernant la représentation intervallaire des listes arborescentes http://sqlpro.developpez.com/cours/arborescence/.
Je me suis d'abord intéressé à la problématique de l'accès concurrent dans le cas de l'insertion (je ne suis pas allé plus loin) et il me semble avoir trouvé une faille dans la manière de faire et je soumets à votre sagacité ma réflexion (qui, je l'espère, n'est pas foireuse car je connais plus Oracle que SQLServer !).
Dans le code la procédure SP_INS_NOMENCLATURE, il y a dès le début le commencement d'un transaction :
puis il y a la récupération de la valeur du père :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 -- démarrage transaction SET TRANSACTION ISOLATION LEVEL SERIALIZABLE BEGIN TRANSACTION INSERT_NOMENCLATURE
puis enfin, il y a la mise à jour des bornes dans les différents cas :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 -- Le parent existe toujours ? SELECT @OK = count(*) FROM T_NOMENCLATURE_NMC WHERE NMC_ID = @id_parent IF @OK = 0 OR @OK IS NULL BEGIN RAISERROR ('Insertion impossible, le parent n''existe plus !', 16, 1) GOTO LBL_ERROR RETURN END -- On a un parent : on récupère ses éléments SELECT @bgp = NMC_BG, @bdp = NMC_BD, @nivp = NMC_NIVEAU FROM T_NOMENCLATURE_NMC WHERE NMC_ID = @id_parent
Sur le principe, j'ai 2 remarques à faire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 -- insertion d'un père IF @mode = 'P' BEGIN -- Décalage de l'ensemble colatéral droit UPDATE T_NOMENCLATURE_NMC SET NMC_BD = NMC_BD + 2 WHERE NMC_BD > @bdp ...
1°) la première est que faire SELECT @OK=count(*)... pour savoir si le parent existe toujours n'est pas suffisant car l'enregistrement peut être modifié (bornes modifiées par exemple) ou supprimé entre temps quand on fait le SELECT @bgp=... suivant. Il faudrait faire un SELECT WITH HOLDLOCK (ou un SELECT FOR UPDATE en Oracle)
2°) en conséquence du 1°) les UPDATE pour modifier les bornes peuvent être faux.
Vos avis ?
Partager