web-dev-qa-db-fra.com

Comment testez-vous des conditions de course dans une base de données?

J'essaie d'écrire un code de base de données pour vous assurer que ce n'est pas soumis à des conditions de course, afin de vous assurer que j'ai enfreint les bonnes lignes ou les tables. Mais je me demande souvent: mon code est-il correct? Est-il possible de forcer les conditions de race existantes à manifester? Je veux être sûr que s'ils se produisent dans un environnement de production, ma demande fera la bonne chose.

Je sais généralement exactement quelle requête concurrente est susceptible de causer un problème, mais je ne sais pas comment les forcer à courir simultanément pour voir si le comportement correct se produit (par exemple, j'ai utilisé le type de serrure correct), que les mauvaises erreurs sont jeté, etc.

Remarque: J'utilise PostgreSQL et Perl, donc si cela ne peut pas être répondu de manière générale, il devrait probablement être préservé comme tel.

Mise à jour : Je préférerais cela si la solution était programmatique. De cette façon, je peux écrire des tests automatisés pour vous assurer qu'il n'y a pas de régressions.

30
xenoterracide

Je le fais tout le temps avec mes modules T-SQL.

Essentiellement, tout ce que vous avez à faire est Exécutez 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 disposiez d'une boîte de serveur SQL avec des processeurs décents.

J'ai écrit quelques exemples ici et ici .

12
A-K

Je travaille habituellement avec l'outil de ligne de commande de la SGBDM, il suffit de disposer de 2 (ou de plus) des instances de la CLI lancée. Vous pouvez ensuite rejouer un par un à un et une course (qui ressemblerait à une action d'action-RPG) les instructions SQL de votre couche d'application envoient. Vous devriez expérimenter/sentir les systèmes de verrouillage en action, car votre CLI "se bloque" un peu, en attendant que les serrures soient libérées des autres CLI.

Si cela semble clair comme boue, n'hésitez pas à le dire ;-)

4
Julien

Les conditions de course nécessitent plusieurs threads d'exécution, par conséquent sur un test d'unité, vous devrez pouvoir démarrer un ou plusieurs fils. Dans Oracle, j'utiliserais dbms_schéduler pour exécuter un processus pour simuler un deuxième utilisateur. Si PostgreSQL/Perl a un moyen d'initier un deuxième processus de manière programmatique, vous devriez être capable de faire quelque chose comme ceci:

processus 1 processus 2

 Démarrer le processus 2. >> 
 Délai pour permettre à 2 de faire son travail. 
. Verrouillez des lignes ou modifiez des données. 
. Retard pour permettre 1 de faire son travail. 
 Tentative de verrouiller des lignes ou de modifier des données. . 
 Vérifiez que la bonne manipulation est effectuée. .
Prend fin. .
                                                Prend fin.

Il est bon de voir la réflexion sur la manière de gérer les conditions de race et sur la manière de les tester plus important.

1
Leigh Riffel