0

私がやろうとしているのは、SSIS を使用して、Oracle 11 DB (クエリ) から SQL Server 2008 (単一テーブル) にいくつかの情報をコピーすることです。どうやら私はトランザクションのものと混同されました。トランザクション オプションをデフォルト値のままにするとすべてが正常に実行されますが、Package Transaction プロパティを Required に設定すると (またはデータ フロー コンポーネントの Transaction プロパティの 1 つを Required に設定すると)、次のエラーが発生します。したがって、この DTSX スクリプトを実行しようとすると、次のエラーが発生します。

Microsoft (R) SQL Server Execute Package Utility
Version 10.0.2531.0 for 32-bit
Copyright (C) Microsoft Corp 1984-2005. All rights reserved.

Started:  11:38:02 §£
Info: 2013-01-16 11:38:02.45
   Code: 0x4001100A
   Source: issued_import 
   Description: Starting distributed transaction for this container.
End Info
Info: 2013-01-16 11:38:04.52
   Code: 0x4004300A
   Source: Data Flow Task 1 SSIS.Pipeline
   Description: Validation phase is beginning.
End Info
Info: 2013-01-16 11:38:05.01
   Code: 0x40043006
   Source: Data Flow Task 1 SSIS.Pipeline
   Description: Prepare for Execute phase is beginning.
End Info
Error: 2013-01-16 11:38:05.10
   Code: 0xC0047062
   Source: Data Flow Task 1 Source - Query [1]
   Description: System.InvalidOperationException: Unable to enlist in a distributed transaction
   at Oracle.DataAccess.Client.OracleConnection.EnlistTransaction(Transaction transaction)
   at Microsoft.SqlServer.Dts.Runtime.ManagedHelper.GetManagedConnection(String assemblyQualifiedName, String connStr, Object transaction)
   at Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSConnectionManager100.AcquireConnection(Object pTransaction)
   at Microsoft.SqlServer.Dts.Pipeline.DataReaderSourceAdapter.AcquireConnections(Object transaction)
   at Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HostAcquireConnections(IDTSManagedComponentWrapper100 wrapper, Object transaction)
End Error
Error: 2013-01-16 11:38:05.10
   Code: 0xC004701A
   Source: Data Flow Task 1 SSIS.Pipeline
   Description: component "Source - Query" (1) failed the pre-execute phase and returned error code 0x80131509.
End Error
Info: 2013-01-16 11:38:05.10
   Code: 0x4004300B
   Source: Data Flow Task 1 SSIS.Pipeline
   Description: "component "SQL Server Destination" (102)" wrote 0 rows.
End Info
Info: 2013-01-16 11:38:05.10
   Code: 0x40043009
   Source: Data Flow Task 1 SSIS.Pipeline
   Description: Cleanup phase is beginning.
End Info
Info: 2013-01-16 11:38:05.10
   Code: 0x4001100C
   Source: Data Flow Task 1 
   Description: Aborting the current distributed transaction.
End Info
Info: 2013-01-16 11:38:05.10
   Code: 0x4001100C
   Source: issued_import 
   Description: Aborting the current distributed transaction.
End Info
DTExec: The package execution returned DTSER_FAILURE (1).
Started:  11:38:02 §£
Finished: 11:38:05 §£
Elapsed:  2.823 seconds

分散トランザクションを行うことに興味がないことに注意してください-関連するサービスはSQL Server側で実行されていますが、Oracle側では何も行われていないと確信しており、おそらく分散トランザクションは失敗するはずです. これが事実である場合、これに対処するために他にどのような方法がありますか? データ フロー タスクを BEGIN/END TRANSACTION Execute SQL ブロックにラップするには (ここで提案されているように)?

4

1 に答える 1

1

デフォルトのトランザクション タイプを からSupportedに変更することRequiredで、潜在的に欠陥のあるプロセスの理解では、プロセスが完全に単一の SQL Server 上にある場合、SSIS エンジンは基本的に を使用しBEGIN TRANてトランザクションを処理します。複数のサーバーが関係している場合、SSIS は分散トランザクション コーディネーターを使用して、適切な言語をリスナーに話しかけ、トランザクションを機能させます。

DB2 の場合、トランザクション内からデータを読み取りたいだけのアカウントに、何らかの許可を明示的に付与する必要がありました (具体的なことはわからないので手を振ってください)。メモリが正常に機能する場合、MySQL ソースで同様の問題が発生しました。

私たちは怠惰なプログラマーであるため、ネイティブ トランザクションを使用したかったのですが、トランザクションで読み取りたい可能性のあるすべての DB2 データに対して変更管理要求を送信するという面倒な作業を行いたくなかったため、解決策は 2 つのデータを作成することでした。フロー タスク。制御フローはサポートされたままになりました。最初のタスクは、Supported トランザクション オプションで実行されました (NotRequired も機能していました)。このタスクは、ホスト システムからデータをクエリし、それを RAW 宛先に書き込みました。RAW は、SSIS が非常に効率的に使用できるバイナリ ファイル形式であり、タイプ セーフです。2 番目のデータ フロー タスクでは、トランザクションが [必須] に設定され、RAW ファイルがソースとして使用され、宛先テーブルにルーティングされます。トランザクションはファイルには意味がないので、

ただし、これにはコストがかかります。それはディスクです。SSIS がディスクにアクセスするたびに、ゲームに負けたことになります。ディスク IO が痛むので、大きなボリューム (IO サブシステム、データをロードするための SLA などに大きく依存) の場合、ソース システムからデータを読み取り、ローカル システムに書き込み、そのデータを読み込んで、その後、最終的にターゲット システムに書き込みます。これは、SSIS がメモリ内で多くのことを行うことによって回避しようとする大量の読み取りと書き込みです。私たちのボリュームは、事務処理の煩わしさを上回るほどパフォーマンスに影響を与えるほどではありませんでしたが、パフォーマンステスト後にその電話をかけることができるのはあなただけです.

于 2013-01-16T16:14:58.880 に答える