Blocages distribués dans la base de données Aurora Postgre Limitless SQL - Amazon Aurora

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Blocages distribués dans la base de données Aurora Postgre Limitless SQL

Dans un groupe de partitions de base de données, des blocages peuvent se produire entre des transactions distribuées entre différents routeurs et partitions. Par exemple, deux transactions distribuées simultanées qui s'étendent sur deux partitions sont exécutées, comme le montre la figure suivante.

Bloc distribué sur deux transactions distribuées.

Les transactions verrouillent les tables et créent des événements d'attente dans les deux partitions comme suit :

  1. Transaction distribuée 1 :

    UPDATE table SET value = 1 WHERE key = 'shard1_key';

    Cela permet de verrouiller le shard 1.

  2. Transaction distribuée 2 :

    UPDATE table SET value = 2 WHERE key = 'shard2_key';

    Cela permet de verrouiller le shard 2.

  3. Transaction distribuée 1 :

    UPDATE table SET value = 3 WHERE key = 'shard2_key';

    La transaction distribuée 1 attend la partition 2.

  4. Transaction distribuée 2 :

    UPDATE table SET value = 4 WHERE key = 'shard1_key';

    La transaction distribuée 2 attend la partition 1.

Dans ce scénario, ni la partition 1 ni la partition 2 ne voient le problème : la transaction 1 attend la transaction 2 sur la partition 2, et la transaction 2 attend la transaction 1 sur la partition 1. D'un point de vue global, la transaction 1 attend la transaction 2, et la transaction 2 attend la transaction 1. Cette situation dans laquelle deux transactions sur deux partitions différentes s'attendent l'une l'autre est appelée impasse distribuée.

La base de données Aurora Postgre SQL Limitless peut détecter et résoudre automatiquement les blocages distribués. Un routeur du groupe de partitions de base de données est averti lorsqu'une transaction attend trop longtemps pour acquérir une ressource. Le routeur recevant la notification commence à collecter les informations nécessaires auprès de tous les routeurs et partitions du groupe de partitions de base de données. Le routeur met ensuite fin aux transactions qui participent à un blocage distribué, jusqu'à ce que les autres transactions du groupe de partitions de base de données puissent se poursuivre sans être bloquées les unes par les autres.

Le message d'erreur suivant s'affiche lorsque votre transaction faisait partie d'un blocage distribué, puis que le routeur y a mis fin :

ERROR: aborting transaction participating in a distributed deadlock

Le paramètre de rds_aurora.limitless_distributed_deadlock_timeout cluster de base de données définit le temps d'attente de chaque transaction sur une ressource avant de demander au routeur de vérifier l'absence d'un blocage distribué. Vous pouvez augmenter la valeur du paramètre si votre charge de travail est moins sujette aux situations de blocage. La valeur par défaut est de quelques 1000 millisecondes (1 seconde).

Le cycle de blocage distribué est publié dans les SQL journaux Postgre lorsqu'un blocage entre nœuds est détecté et résolu. Les informations relatives à chaque processus impliqué dans l'impasse sont les suivantes :

  • Nœud coordinateur qui a lancé la transaction

  • ID de transaction virtuel (xid) de la transaction sur le nœud coordinateur, au format backend_id/backend_local_xid

  • ID de session distribué de la transaction