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 :
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 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
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
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
-- 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
...
Sur le principe, j'ai 2 remarques à faire :
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 ?