私は、プライマリ・データベースとしてDB2を使用するマルチスレッド・アプリケーションで作業しています。過去には、自動生成された一意の識別子が必要なテーブルに対してID列を使用しました。これを行うには、同じトランザクションで以下の2つのクエリを実行します。マルチスレッド・アプリケーションでDB2シーケンス値を取得する方法
INSERT INTO tbname (IDENTITY_COL, ...) VALUES (DEFAULT, ...);
SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1;
これで、代わりに[順序]に切り替えるようになりました。私はあなたが "NEXT VALUE FOR colname" INSERTとSELECTステートメントの両方で使用できることを知っていますが、マルチスレッドアプリケーションの競合状態を危険にさらすことなく、同じ値でINSERTとSELECTを行う方法を理解できません。私が使用している場合たとえば、:
INSERT INTO tbname (SEQUENCE_COL, ...) VALUES (NEXT VALUE FOR SEQUENCE_COL, ...);
SELECT PREVIOUS VALUE FOR SEQUENCE_COL;
その後、別のINSERTが故に私に間違った価値を提供し、上記のINSERTとSELECTの間で実行された可能性があります。変数に
SELECT NEXT VALUE FOR SEQUENCE_COL;
ストア値とINSERTへのそれを渡します:私がしようとした場合
INSERT INTO tbname (SEQUENCE_COL, ...) VALUES (variable_value, ...);
を次に別のスレッドが同じNEXT VALUEを持って、同じ値を挿入しようとする可能性がありますDB2-803エラーが発生します。マルチスレッド環境でSEQUENCE列を使用することは可能ですか、IDENTITY列を維持するために戦う必要がありますか?
接続固有の説明を提供していただきありがとうございます。まさに私が聞く必要があったもの。 –