J'essaie d'écrire du code de base de données pour m'assurer qu'il n'est pas soumis aux conditions de concurrence, pour m'assurer que j'ai verrouillé les lignes ou les tables correctes. Mais je me demande souvent: mon code est-il correct? Est-il possible de forcer des conditions de concurrence existantes à se manifester? Je veux être sûr que si cela se produit dans un environnement de production, mon application fera ce qu'il faut.
Je sais généralement exactement quelle requête simultanée est susceptible de causer un problème, mais je ne sais pas comment les forcer à s'exécuter simultanément pour voir si le comportement correct se produit (par exemple, j'ai utilisé le bon type de verrou), que les bonnes erreurs sont jeté, etc.
Remarque: J'utilise PostgreSQL et Perl, donc si cela ne peut pas être répondu de manière générique, il devrait probablement être repensé en tant que tel.
Mise à jour: je préfère que la solution soit programmatique. De cette façon, je peux écrire des tests automatisés pour m'assurer qu'il n'y a pas de régressions.
la source
Réponses:
Je le fais tout le temps avec mes modules T-SQL.
Essentiellement, tout ce que vous devez faire est d' exécuter vos modules à partir de deux connexions ou plus dans une boucle pendant quelques minutes . En règle générale, tous les problèmes potentiels sont exposés en quelques minutes, en supposant que vous disposez d'une boîte SQL Server avec des processeurs décents.
J'ai écrit quelques exemples ici et ici .
la source
Je travaille généralement avec l'outil de ligne de commande du SGBDR, en démarrant simplement 2 (ou plus) instances de la CLI. Vous pouvez ensuite rejouer un par un et comme une course (qui ressemblerait à un action-RPG) les instructions SQL que votre couche d'application envoie. Vous devriez expérimenter / sentir les systèmes de verrouillage en action car votre CLI "se bloquera" un peu, en attendant que les verrous soient libérés des autres CLI.
Si cela semble clair comme de la boue, n'hésitez pas à le dire ;-)
la source
Les conditions de concurrence nécessitent plusieurs threads d'exécution, donc pour tester unitaire ceci, vous devrez pouvoir démarrer un ou plusieurs threads. Dans Oracle, j'utiliserais DBMS_Scheduler pour exécuter un processus pour simuler un deuxième utilisateur. Si PostgreSQL / Perl a un moyen d'initier un second processus par programme, alors vous devriez pouvoir faire quelque chose comme ceci:
Processus 1 Processus 2
Il est bon de voir comment réfléchir aux conditions de course et, surtout, comment les tester individuellement.
la source
Tant que vous verrouillez des rangées, vous ne devriez pas vous retrouver dans une situation de course, car cela est généralement dû à l'absence de verrouillage.
Mais vous pourriez être bloqué si une question bloque votre question trop longtemps.
Ceci est difficile à tester car le temps des requêtes peut changer lorsque la base de données se développe.
Les requêtes qui fonctionnent correctement avec 100 000 lignes de données de test sortent du tableau avec 10 000 000 lignes.
Ce type de problème peut être très difficile à trouver à l'avance, mais de nombreuses bases de données ont une méthode d'identification des requêtes lentes.
En utilisant ce standard, vous devriez être en mesure de piéger toutes les requêtes en difficulté avec un avertissement suffisant.
Si vous verrouillez vous-même, c'est une autre histoire, mais là je ne peux pas vous aider.
la source
select for update
ci n'existeraient pas si elles