Graphe de précédence

Un graphe de précédence, également appelé graphe de conflit[1] ou graphe de serializability, est utilisé dans le cadre du concurrency control[Quoi ?] dans les bases de données[2].

Le graphe de précédence pour un programme S contient :

  • Un nœud pour chaque transaction validée dans S ;
  • Un arc de T i à T j si une action de T i précède et entre en conflit avec l'une des actions de T j . Autrement dit, les actions appartiennent à différentes transactions, au moins une des actions est une opération d'écriture et les actions accèdent au même objet (lecture ou écriture).

Exemples d'un graphe de précédence modifier

Exemple 1 modifier

 
Exemple 1
 

Exemple 2 modifier

               

Un graphe de précédence du programme D, avec 3 transactions. Comme il existe un cycle (de longueur 2 ; avec deux arêtes) à travers les transactions validées T1 et T2, cette planification (historique) n'est pas Conflict serializable (en). Notez que le commit de la transaction 2 n'a aucune signification concernant la création d'un graphe de priorité.

Test de la sérialisabilité avec le graphe de précédence modifier

 
Exemple de test de sérialisabilité

Algorithme pour tester la sérialisabilité des conflits d'une annexe S avec un exemple d'horaire.

 

             

  1. Pour chaque transaction T x participant à l'horaire S, créez un nœud étiqueté T i dans le graphe de priorité. Ainsi le graphe de précédence contient T 1, T 2, T 3 .
  2. Pour chaque cas dans S où T j exécute un read_item (X) après que T i exécute un write_item (X), créez une arête (T i → T j ) dans le graphe de priorité. Cela ne se produit nulle part dans l'exemple ci-dessus, car il n'y a pas de lecture après écriture.
  3. Pour chaque cas dans S où T j exécute un write_item (X) après que T i ait exécuté un read_item (X), créez une arête (T i → T j ) dans le graphe de priorité. Il en résulte un bord dirigé de T 1 à T 2 (car T 1 a R(A) avant T 2 a W(A) ).
  4. Pour chaque cas dans S où T j exécute un write_item (X) après que T i exécute un write_item (X), créez une arête (T i → T j ) dans le graphe de priorité. Il en résulte des fronts dirigés de T 2 vers T 1, T 2 vers T 3 et T 1 vers T 3 .
  5. L'ordonnancement S est sérialisable si et seulement si le graphe de précédence n'a pas de cycles. Comme T 1 et T 2 constituent un cycle, l'exemple ci-dessus n'est pas (conflit) sérialisable.

Références modifier

Liens externes modifier