5

コピーが失敗した場合は、DB「ソース」からデータベース「宛先」にデータをコピーする必要があります。「宛先」でロールバックする必要があります。2 つの接続は、接続マネージャーで OLE DB として定義されます。

これが機能していない私の現在の試みです。組み込みのトランザクション管理 (タスク トランザクションをrequiredに設定) をいじってみましたが、「宛先」に接続できなくなっただけでした。

宛先では "RetainSameConnection" = true が設定されていますが、これは特に理由もなく "source" では false です。

また、「MaxConcurrentExecutables」= 1 を設定して、SSIS が最初にロールバックを実行するのを妨げます。

シーケンス内の各タスクは、「Isolation level」=ReadUncommitted および「transactionOption」=supported に設定されています。

「失敗するスクリプト」は、トランザクションが機能していることをテストするために常に失敗するスクリプトです。

ここに画像の説明を入力

タスク「begin tran」のコードは「BEGIN TRANSACTION」で、接続は「destination」に設定されています

タスク「rollback tran」のコードは「rollback transaction」で、接続は「destination」に設定されています

ロールバックは、「ロールバック トランザクション リクエストに対応する 'BEGIN TRANSACTION' がありません」で失敗します。

4

1 に答える 1

8

ここでは 2 つの概念が混在しています。SSIS でトランザクションを実現するには、2 つの方法があります。1 つ目は SSIS トランザクションです。ここで、パッケージを に設定しTransactionOption = Supported、コンテナーを に設定しTransactionOption = Required(トランザクションを開始します)、2 つのデータ フロー タスクを に設定する必要がありますTransactionOption = Supported。これにより、両方がオープン トランザクションに参加します。ただし、このオプションには分散トランザクション コーディネーターが必要であり、それを回避する方法がないことに注意してください。

トランザクションを実現する 2 つ目の方法は、SQL ネイティブ トランザクションを使用することです。ここでは、トランザクションを開始する SQL 実行タスク、続いてデータ フロー タスク、トランザクションをコミットする別の SQL 実行タスク (もちろん、ロールバックする別のタスク) があります。ここでの問題は、今述べたすべてのタスクが同じ接続マネージャーを使用し、retainsameconnection = Trueその接続マネージャーでそれを使用することが要件であることです。それ以外の場合は、SSIS と SQl Server がまだ分散トランザクションと見なしているため、機能しません。ただし、それらは同じサーバー上にないため、BEGIN DISTRIBUTED トランザクションを使用する必要があります。これには、やはり分散トランザクション コーディネーターが必要です。また、分散ネイティブ SQL トランザクションが SSIS で適切に機能しないことも思い出しました。

簡単に言えば、SSIS のトランザクションでやろうとしていることが達成できないということです。別の方法は、補正ブロックを使用することです。SELECT MAX(ID)ここで、挿入が失敗すると、要件に最も適した時間または に基づいて、挿入したばかりのデータを削除する SQL 実行タスクが作成されます。

于 2012-10-22T16:56:24.737 に答える