2017-08-15 3 views
0

J'ai un problème avec l'isolement de la transaction, nous allons considérer deux transactions:Mise à jour ligne parent verrouille ligne enfant dans PostgreSQL (clé étrangère, 9.1)

Première transaction 1 fait une mise à jour dans une rangée sur le tableau 1, puis, transaction 2 effectue une mise à jour dans une ligne de la table enfant qui référence le pk de la table 1 qui a été mise à jour dans la transaction 1, analysant les transactions que nous pouvons voir un verrou, la transaction 2 sera verrouillée jusqu'à ce que la transaction 1 soit validée un moyen d'éviter ce verrouillage? Ma transaction 1 n'affecte pas le tableau 2, car il s'agissait d'une mise à jour dans une colonne spécifique. P.S. Ma version de PostgreSQL est 9.1, j'ai vérifié PostgreSQL 9.6 et ça n'arrive pas, est-ce qu'il y a une solution?

Répondre

1

La solution adoptée était de diviser les colonnes couramment mises à jour en une table distincte, résout-elle, car Postgres ne bloquera pas la table parente.

1

Vous avez déjà identifié comment résoudre le problème: mise à niveau. PostgreSQL 9.6 possède une fonctionnalité, les verrous FOR KEY SHARE, qui sont utilisés par les clés étrangères pour éviter de verrouiller la ligne entière lorsqu'une ligne enfant est insérée/mise à jour. Cette fonctionnalité n'est pas dans 9.1.

Alternativement, vous pouvez DROP la contrainte et de s'appuyer sur l'application pour maintenir la cohérence. PostgreSQL ne prendra plus un verrou de ligne FOR SHARE sur la ligne parente lorsque la ligne enfant est insérée/mise à jour, car il n'existe plus de relation de clé étrangère formelle.

+0

En ce moment, je ne peux pas mettre à jour mon PostgreSQL, j'ai trouvé une solution de contournement, j'ai écrit une réponse dans mon post. Je vous remercie. –