SELECT
ou INSERT
sont-elles sujettes à des conditions de concurrence ? Dans votre fonction PL/pgSQL, vous insérez des données dans la table Posts
et parcourez les balises pour les insérer dans les tables Tags
et Taggings
. Vous craignez que ce processus puisse rencontrer une situation de concurrence critique lorsque plusieurs utilisateurs tentent de supprimer des balises et de créer des publications en même temps.
Sous charge d'écriture simultanée, le concept de "SELECT
ou INSERT
" survient lorsque vous essayez d'insérer une nouvelle ligne dans une table, mais que vous souhaitez récupérer la ligne alors qu'elle existe déjà. En SQL, cela peut être réalisé en utilisant l'instruction INSERT ... ON CONFLICT ... DO SOMETHING
.
Votre fonction utilise cette technique lors de l'insertion de balises dans la table Tags
, mais vous pouvez rencontrer une condition de concurrence critique si une autre transaction supprime la balise associée avant la validation de votre transaction. Pour éviter cela, envisagez les techniques suivantes :
SELECT
au sein d'une fonction, utilisez FOR SHARE
pour verrouiller les lignes existantes afin de garantir que d'autres transactions ne peuvent pas les modifier pendant que votre transaction est en cours. LIMIT
UNION ALL
avec : utilisez une requête UNION ALL
pour combiner les instructions SELECT
et INSERT
, en utilisant la clause LIMIT 1
sur le résultat. Cette technique permet une sortie rapide si la ligne existe déjà ou si l'insertion a réussi. INSERT
Fonction séparée : externalisez l'opération d'insertion dans une fonction distincte. Cette fonction doit gérer toute gestion des exceptions nécessaire, tandis que la fonction principale se concentre sur la logique globale. En mettant en œuvre l'une de ces méthodes, vous pouvez éviter les conditions de concurrence dans vos fonctions et garantir l'intégrité des données dans la base de données.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!