Garantir des insertions de lignes uniques dans les bases de données SQL sous pression
Un défi courant pour les développeurs SQL consiste à insérer des lignes sans créer de doublons. La méthode traditionnelle implique souvent une sous-requête :
INSERT INTO TheTable SELECT @primaryKey, @value1, @value2 WHERE NOT EXISTS (SELECT NULL FROM TheTable WHERE PrimaryKey = @primaryKey)
Sous forte charge, cependant, cette approche peut conduire à des violations de clé primaire, compromettant l'atomicité des instructions.
Pour atténuer cela, certains développeurs utilisent des mécanismes de verrouillage :
INSERT INTO TheTable WITH (HOLDLOCK, UPDLOCK, ROWLOCK) SELECT @primaryKey, @value1, @value2 WHERE NOT EXISTS (SELECT NULL FROM TheTable WITH (HOLDLOCK, UPDLOCK, ROWLOCK) WHERE PrimaryKey = @primaryKey)
Mais un verrouillage excessif a un impact significatif sur les performances.
Une stratégie plus efficace, souvent appelée méthode « JFDI » (Just F***ing Do It), implique une insertion directe avec gestion des erreurs :
BEGIN TRY INSERT etc END TRY BEGIN CATCH IF ERROR_NUMBER() <> 2627 RAISERROR etc END CATCH
Cela évite les requêtes imbriquées et le verrouillage, favorisant ainsi la concurrence en cas de volume élevé.
Il est essentiel qu’une indexation appropriée soit primordiale. Comme l'a souligné un développeur SQL chevronné dans la « Leçon 4 », il n'est pas fiable de s'appuyer uniquement sur des sous-requêtes pour prévenir les doublons. Un index unique, associé à une gestion appropriée des erreurs (comme la détection de l'erreur 2627), assure une prévention automatique des doublons, rationalisant ainsi le processus.
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!