2017-02-01 11 views
0

私のアプリケーションは処理して更新する必要があります。 MAIN_TBテーブルに10百万レコード。パフォーマンスを向上させるために、私はJDBCドライバを使って自分のDB2データベースにアクセスする4つのクライアントでアプリケーションを実行します。私はこれらのクライアント間でレコードを分割する方法を知らないので、MAIN_TBテーブルのロックされたレコードに関する情報を保持するLOCK_TBテーブルを持つことに決めました。頻繁にINSERT/DELETEがDB2テーブル/インデックスを破壊しますか?

したがって、クライアントはMAIN_TBテーブルの/ updateレコードで作業する前にLOCK_TBテーブルに "ロック"レコードを挿入します。その後、クライアントはそれをロック解除します。

INSERT INTO LOCK_TB 
     (doc_id, locked_on, locked_by) 
VALUES (111, '2017-01-01', 222) 

DOC_IDは主キーであり、MAIN_TBテーブルのDOC_ID列に対する外部キーを持っています。

したがって、INSERTが失敗した場合、レコードはすでに存在する(ロックされている)ことを意味し、クライアントはMAIN_TBテーブルのレコードをスキップします。それが失敗しない場合は、新しいロックレコードが挿入され、クライアントがMAIN_TBテーブルのデータを処理できることを意味します。それはロックを解除しています行われたら:

DELETE FROM LOCK_TB WHERE doc_id=111 

(4つのクライアントがあるので、明らかにLOCK_TB内の4つのレコードよりも多くはないがあるでしょう)

をこれら四つのクライアントはDELETE/INSERTを要求した場合に何が起こるのだろう同時にLOCK_TBテーブルに追加してください(短期間の要求の影響が大きい)?

クライアント間で作業を分割するベストプラクティスは何ですか?私は上記のモデルでOKですが、何か(テーブル、データベース、サーバーのいずれか)を傷つけるでしょうか?

+4

は、なぜあなたはDB2が独自に同時実行を管理することはできません参照ロックで? –

答えて

0

技術的には、2つのスレッドがオブジェクトに対して同時にロックを要求することはできません。 CPUクロックはサイクルをスレッドに変更します。

テーブルのロックを最初に要求するスレッドは、ロックを取得します。後続のスレッドは、ロックが解除されるまで待機します。ロックがLOCKTIMEOUTデータベース構成パラメーターより長く待たされた場合、リクエスターはSQLコード911の理由コードでタイムアウトします。68

これは、表または索引に損害を与えません。よりたくさんの

http://db2portal.blogspot.co.za/search?q=DB2+Locking

+0

私はDB2システムのロックについて話していません。私はMANT_TBの行へのアクセスを制限したいと思います。したがって、CLIENT1上の1つの特定のPROCESS1だけがアクセスできます。 PROCESS1 ON CLIENT2は行にアクセスできません。 CLIENT2のPROCESS2はアクセスできます。これがLOCK_TB表を作成した理由です。 – VladP

+0

作業単位がコミットされていない限り、行はロックされます。 –

+0

ご迷惑をおかけして申し訳ありません。 MAIN_TBテーブルのレコードをロックする必要はありません。私はちょうどそれを処理する間に他のクライアントがそれをスキップしたいと思う。だから私は4つのクライアント間で作業を分割したいと思う。そしてCLIENT1はCLIENT2が既にそのレコードで作業していることを知る必要があります(いくつかの手順を実行しています..)。このレコードをスキップすることができます – VladP

関連する問題