2016-05-27 15 views
0

私たちはDB2データベースを使用しています。一部のデータウェアハウス・テーブルはTRUNCATEされ、毎日リロードされます。別のプロセスが同じテーブルに対してINSERT文を実行しているときに、デッドロックの問題が発生します。瞬時に同じテーブルの切り詰めと挿入

シナリオ

テーブルに対してTRUNCATEが実行されます。 同時に、別のプロセスが同じテーブルのデータを挿入します(このプロセスはトリガーに基づいており、いつでも開始できます)。

回避策はありますか? これまで考えてきたことは、トランケートの優先順位をつけて、インサートでスルーグッとすることです。これを解く方法はありますか?どんな助けもありがとう。

+0

私の理解では、両方のプロセスが追加のロックを必要とする他の作業を行う場合、上記の状況でデッドロックに陥ることがあります。 TRUNCATEプロセスはそれ以上のことをしていますか? –

+0

truncateは、他のプロセスが@data_henrikにレコードを挿入しようとしている同じテーブルのレコードを切り捨てているだけです。 –

+0

ビジネスルールが重要です - どのプロセスが優先されているか - 非常に重要で、再現可能な出力 – MichaelTiefenbacher

答えて

1

トランケートを実行する前にテーブルロックを要求する必要があります。

これを行うと、デッドロックを得ることはできません。挿入が完了する前にテーブルロックが許可されず、ロックが解除されると別の挿入は実行されません。コメントから

更新:

あなたはLOCK TABLEコマンドを使用することができます。詳細はあなたの状況に依存しますが、SHAREDモードでも逃げることができます。これにより読み取りは許可されますが、挿入は許可されません(これはあなたが信じている問題です)。

これで問題は解決されません。これはおそらく、挿入文が複雑になることを意味します。多分、他のテーブルや連合テーブルから読み込んでいるかもしれません。このような場合は、ステージングテーブルを追加するようにソリューションを再設計してください(最初にステージングテーブルに挿入してゆっくりと挿入し、ステージングテーブルからターゲットテーブルに挿入してください)。

+0

詳細をプロセスに教えてもらえますか?実際にこのデータベースを初めて使用している場合 –

+0

コマンドはLOCK TABLEです。排他モードの - 詳細は、http://www.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.sql.ref.doc/を参照してください。 doc/r0000972.html?lang = enそして再度リリースすることを忘れないでください – MichaelTiefenbacher

関連する問題