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