2011-07-21 14 views
7

私は、プライマリ・データベースとして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列を維持するために戦う必要がありますか?

答えて

6

上記の一連のステートメントは正しくありません。

"次の値"と "前の値"は接続に固有です。

異なるスレッドからのシーケンスへのアクセスは決して "レース"条件を作成しません。各接続は、シーケンスに対して完全に分離された「環境」を持っています。

+0

接続固有の説明を提供していただきありがとうございます。まさに私が聞く必要があったもの。 –

6

質問に誤った仮定があります。

私がしようとした場合:変数に

SELECT NEXT VALUE FOR SEQUENCE_COL; 

ストア値とINSERTへのそれを渡す:

INSERT INTO tbname (SEQUENCE_COL, ...) VALUES (variable_value, ...); 

を次に可能性があります別のスレッドが同じNEXT VALUEを取得して、私に試行します同じ値を返す

これは正しくありません。第2のスレッドは、第1のスレッドと同じ値ではなく、異なるNEXTVALを得る。

は私もこの部分に私の意見を追加したい:

今は代わりにシーケンスに切り替えることを迫られています。

アイデンティティからシーケンスに切り替えるという本当の理由があるとは思いません。彼らは基本的に同じことです。

INSERT INTO tbname (SEQUENCE_COL, ...) VALUES (NEXT VALUE FOR SEQUENCE_COL, ...); 
SELECT PREVIOUS VALUE FOR SEQUENCE_COL; 

あなたの仮定はその後、別のINSERTがに関する「それゆえ、私に間違った値を提供し、上記のINSERTとSELECTの間で実行された可能性があります:マイケルSharek(正しくは)言ったことに加えて

+0

感謝を。 a_horse_with_no_nameによって提供される接続の安全性を明確にすることで、なぜそれが問題なのかをより深く理解することができますが、両方の回答が大いに役立ちました。圧力に関しては、Identitiesに対するオーバーヘッドの一部を失い、プログラマーにこれらの列がどのように設定されているかについての詳細を説明します(高レベルの説明)。 –

2

他の正解に加えて、あなたはまた、単に行を挿入し、次のように挿入された値を返すために、単一のステートメントを使用することができます応答のための

SELECT SEQUENCE_COL FROM NEW TABLE (
    INSERT INTO tbname (SEQUENCE_COL, ...) VALUES (NEXT VALUE FOR MY_SEQUENCE, ...) 
) 
関連する問題