2017-12-05 9 views
0

データを読み込むタスクを持つSSISパッケージがあります。何らかの理由で私は更新し、同じ宛先テーブルを挿入する必要があります。これはデッドロックが発生する同じテーブルの挿入と更新でデッドロックが解決される方法

私はSSIS MULTI-CASTコントロールを使用します。

enter image description here どうすればよいですか?このような状況を解決するには?

+0

両方のステップを同時に実行しないでください。 –

+0

@ Sean Lange、挿入後、同じレコードセットを更新する方法?この状況を解決するには、SSISのISOLATION LEVELSが役立ちます。 – shamim

+0

データを挿入してすぐに更新する必要がある場合は、更新を試みる前に挿入が完了するまで待つ必要があります。あるいは、それを挿入する前に正しい値を見つけてください。これは必ずしも可能ではありません。 –

答えて

0

OLE DBの宛先で、アクセスモードを「FastLoad」から「Table or View」に変更します。前者はテーブルロックを取ることになりますが、大規模な挿入の方が一般的には適していますが、シナリオではテーブルを「ロックされていない」状態にする必要があります。シングルトゥインサートを発行する予定なのでパフォーマンスは低下しますが、「OLE DBコマンド」でシングルトンの更新を行う予定なので、それほど問題にはならないと思います。

最後に、違う。マルチキャストは本質的に行を複製し、それをN個のコンポーネントに送ることができます。私は一般的に、行がターゲット内に存在するかどうかを検出しようとしている人を見て、そのルックアップに基づいて行を挿入または更新します。しかし、マルチキャストではなくルックアップコンポーネントです。たぶん、タイプ2のディメンションなどをしているかもしれませんが、その場合でも、これを達成するためのより良い方法と、あなたが画像に表示しているものとの違いがあります。

0

あなたの方法は、billinkcが言ったように、あなたが効果的に二重のデータ行あり、2つの異なる接続/コンテキストから同時に同じテーブルにINSERTやUPDATEのアクションを実行し、奇妙なようです。これはデッドロックで終わらなければならない。

私はデータに必要な変換を行い、それをDataFlowの中間テーブルに書きます。その後、次のSSISタスクで、MS SQL MERGE - MicrosoftテーブルのアップをOLE DBコマンドで実行します。これにより、並行操作の間にデッドロックが発生しないことが保証されます.MERGEのロジックは非常に柔軟性があります。

なく、少なくとも最後に - 中間テーブルのための専用またはグローバル##一時テーブルを使用し、SSISで定期的にMS SQL #TEMPテーブルでの作業は少しトリッキーです。 MERGE前後の中間をクリーンアップするか、## tempテーブルを適切に作成して処分することを忘れないでください。

関連する問題