私のアプリケーションは処理して更新する必要があります。 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ですが、何か(テーブル、データベース、サーバーのいずれか)を傷つけるでしょうか?
は、なぜあなたはDB2が独自に同時実行を管理することはできません参照ロックで? –