Question

Je travaille sur un projet en utilisant une base de données non-SQL propriétaire où les requêtes peuvent être interrompues et il y avait la base de code tout à fait certains endroits où cette fonctionnalité a été utilisé et est parfaitement raisonnable (par exemple pour arrêter une requête longue en cours d'exécution qui est annulé par l'utilisateur, ou lorsqu'une requête plus récente a lieu et rend la requête précédente obsolète, etc.) et je je réalisais jamais vu ce genre de « requêtes interrompues » auparavant et pensé qu'il pourrait faire une bonne question SO (plusieurs questions, mais ils sont tous liés à exactement la même chose):

  • requêtes SQL peut être interrompue?

  • est cette partie de la norme SQL?

  • si elle ne fait pas partie de la norme SQL, SQL qui permettent BDs requêtes d'être interrompues (aucun exemple les bienvenus)?

  • est-il courant d'interrompre une requête DB (SQL ou non) que vous saurez que vous ne se soucient plus du résultat? (Dans le code de base que j'ai travaillé, cela aide alléger la charge du serveur)

Était-ce utile?

La solution

Imho « interrompu » devrait être remplacé par « tué » ou « mis fin ». Le concept d'interruption peut être source de confusion que l'on peut présumer qu'il permettrait à la requête de reprendre plus tard.

Le standard SQL ne fournit pas un moyen d'interrompre ou de mettre fin à une requête en cours d'exécution, mais tous les SGBD savoir que je n'implémente une KILL-commande ou similaire. Par exemple, dans MySQL un utilisateur peut utiliser SHOW [FULL] PROCESSLIST pour afficher toutes les requêtes en cours d'exécution (et leurs états, les ID de requête, etc.). Les utilisateurs ayant le privilège de KILL peut alors mettre fin à une requête.

La plupart des KILL se produisent parce qu'un risque requête en cours d'exécution trop long ou bloque d'autres requêtes, par exemple. la table manque un index ou le disque est plein. Lorsque vous ne se soucient pas du résultat (par exemple. La navigation du site utilisateur a annulé), souvent le serveur Web lui-même interrompre le processus et, par conséquent la requête en elle-même (aucune interaction manuelle ou programmeur nécessaire)

Autres conseils

Toutes les couches d'accès SGBDR que j'ai jamais travaillé fournissent une méthode d'annulation aux requêtes Annulez de manière asynchrone en cours d'exécution. Consultez la documentation de tout pile technologie d'accès aux données que vous utilisez. .NET / ADO / JDBC fournir une méthode 'annuler'. ODBC - SQLCancel. Il est évident que les vendeurs SGBDR sous-jacent pilote d'accès aux données doit également mettre en œuvre la méthode.

En termes de usefullness d'annulation je tendance à critiquer tout régime qui a fait un usage régulier de celui-ci. À mon avis une meilleure coordination et la conception ou tendraient à atténuer le besoin non administratif.

Il est Dependance significatif sur le fonctionnement interne du SGBDR, la nature de la transaction et système d'isolement. Si le SGBDR utilise un modèle d'accès concurrentiel optimiste (c.-à-Commit est essentiellement libre) l'annulation d'une requête en cours d'exécution peut impliquer une opération de rollback potentiellement coûteux. Dans le pire des cas, une requête en cours d'exécution pendant une heure jusqu'au point d'annulation peut très bien prendre une heure pour rollback.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top