Comment faire pour obtenir une base de données DB2 Valeur de la Séquence dans une Application Multithread
Je suis en train de travailler sur une application multithread qui utilise DB2 pour sa base de données primaire. Dans le passé, nous avons principalement utilisé les colonnes d'Identité pour les tables où nous avions besoin d'une auto-généré identifiant unique. Pour le faire nous-dessous de 2 requêtes dans la même transaction:
INSERT INTO tbname (IDENTITY_COL, ...) VALUES (DEFAULT, ...);
SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1;
Nous sommes maintenant contraints de passer à la Séquence de la place. Je sais que vous pouvez utiliser le bouton "SUIVANT la VALEUR POUR colname" dans les deux INSERT et SELECT, mais je ne peux pas comprendre comment les deux INSÉRER et SÉLECTIONNEZ avec la même valeur sans risquer une condition de concurrence dans une application multithread. Par exemple, si j'utilise:
INSERT INTO tbname (SEQUENCE_COL, ...) VALUES (NEXT VALUE FOR SEQUENCE_COL, ...);
SELECT PREVIOUS VALUE FOR SEQUENCE_COL;
Puis il y a une possibilité d'en INSÉRER un autre a été mené entre le au-dessus d'INSERTION et de SÉLECTIONNER, d'où me donner de la valeur incorrecte. Si j'essaie:
SELECT NEXT VALUE FOR SEQUENCE_COL;
de stocker la valeur dans une variable et le passer dans l'INSERT:
INSERT INTO tbname (SEQUENCE_COL, ...) VALUES (variable_value, ...);
Puis, il y a une possibilité d'un autre thread eu la même VALEUR SUIVANTE et tente d'insérer la même valeur, résultant dans une base de données DB2 -803 erreur. Est-il possible d'utiliser les colonnes de SÉQUENCE dans un environnement multithread, ou dois-je me battre pour garder mon IDENTITÉ colonnes?
OriginalL'auteur Mike Carey | 2011-07-21
Vous devez vous connecter pour publier un commentaire.
En plus de ce que Michael Sharek (correctement) a dit:
Votre hypothèse Puis il y a une possibilité d'en INSÉRER un autre a été mené entre le au-dessus d'INSERTION et de SÉLECTIONNER, d'où me donner de la valeur incorrecte" concernant la séquence ci-dessus de déclarations est incorrect.
La "suivant" et "précédent" sont connexion spécifique.
Accès à une séquence de différents threads ne sera jamais à créer une "race". Chaque connexion est complètement isolé "environnement" pour la séquence.
OriginalL'auteur a_horse_with_no_name
Vous avez une hypothèse erronée dans votre question.
Ce n'est pas correct. Le deuxième thread obtenir un autre NEXTVAL et pas la même valeur que le premier thread.
Je tiens aussi à ajouter mon avis sur cette partie:
Je ne peux pas imaginer être une bonne raison de passer à des séquences de l'identité. Ils sont fondamentalement la même chose.
OriginalL'auteur Michael Sharek
En plus des autres réponses correctes, vous pouvez aussi simplement utiliser une seule instruction pour insérer une ligne et retour inséré valeurs comme suit:
OriginalL'auteur ahu