12

コピー オプションを使用して SqlBulkCopy を使用する場合と使用しない場合の違いを見つけようとしていますSqlBulkCopyOptions.UseInternalTransactionが、テスト アプリケーションでは違いが検出されません。たとえばBatchSize、 が 0 で、(a に) 100 レコードを追加するとDataTable、レコード番号 50 がデータベース テーブルに追加するときにエラーが発生します。テーブルに 0 レコードが取得されます。たとえば、 が 10 に設定されている場合BatchSize、40 レコードを取得します (10 レコードの 4 つのバッチ。5 番目のバッチには障害のあるレコードが含まれており、一括コピーが中止されます)。SqlBulkCopyOptions.UseInternalTransactionが設定されているかどうかは関係ありません。常に同じ結果が得られます。バッチは常に内部トランザクションでコピーされるようです。

私のテスト アプリケーションに興味がある場合は、SqlBulkCopy-Error-and-Transaction-Test.zipをご覧ください。

私の質問は次のとおりです。

  1. 常に内部トランザクションを使用するSqlBulkCopyOptions.UseInternalTransactionため、廃止されましたか?SqlBulkCopy
  2. そうでない場合: このオプションの実際の意味は何ですか? どのような場合に違いが生じるでしょうか?

誰かが明確にできることを願っています

編集: 回答とコメントによると、私の問題は十分に明確ではないと思います。私はその文書を知っています。「デフォルトでは、一括コピー操作は独自のトランザクションです」と書かれています。各バッチは、渡すときに独自のトランザクションを使用しますUseInternalTransaction. しかし、それがデフォルトで一括コピー操作が一括コピー全体に対して 1 つのトランザクションのみを使用することを意味する場合 (バッチごとに 1 つではなく)、BatchSize を特定のサイズに設定し、その後にあるバッチを設定すると、データベースにレコードが取得されません。最初のものはエラーを引き起こします。1 つのトランザクションのみが使用される場合、トランザクション ログに追加されたすべてのレコードがロールバックされます。しかし、障害のあるレコードを含むバッチの前にあるバッチのレコードを取得します。これによると、デフォルトでは各バッチが独自のトランザクションで実行されるようです。つまり、合格しても不合格でも大差ないということUseInternalTransactionです。ここで間違った道を進んでいる場合は、誰かが明確にしていただければ幸いです。

重要な事実が 1 つあります。私は SQL Server 2012 を使用しています。SQL Server 2008 は動作が異なる可能性があります。私はそれを確認します。

編集: usr からの返信のおかげで、私は答えを見つけたと思います: デバッグして少しプロファイリングしたところ、UseInternalTransaction が定義されていない場合、プライベート フィールド _internalTransaction が実際には設定されていないことがわかりました。SqlBulkCopy は、独自の (内部) トランザクションを使用しません。しかし、プロファイリングは、SqlBulkCopy がデータのコピーに TDS (Tabular Data Stream) を使用することを示しました (BatchSize に関係なく)。特に SQL Server の TDS に関する情報はあまり見つかりませんでしたが、SQL Server は内部トランザクションで TDS 一括コピー操作を実行すると想定しています。したがって、UseInternalTransaction は SQL Server にとっては冗長なようですが、安全のために設定します。

4

1 に答える 1