0

優先度の低いデータの挿入中にエラーが発生しても、トランザクションの実行を継続する方法を探しています。実際のネストされたトランザクションが解決策になるようですが、SQL Server 2005/2008 ではサポートされていません。別の解決策は、エラーが重大かどうかを判断するロジックを用意することですが、それも不可能のようです。

私のシナリオの詳細は次のとおりです。

データは ADO.NET/C# を使用してデータベースに定期的に挿入されます。データの一部は重要ですが、一部は問題なく欠落している可能性もあります。挿入が完了すると、データに対していくつかの計算が行われます。(バイタルと非バイタルの両方) このプロセス全体がトランザクション内にあるため、すべてが同期されます。

現在、トランザクション セーブ ポイントが使用され、非重要な挿入中に発生する例外に対して部分的なロールバックが行われます。ただし、これは、トランザクション全体を自動的にロールバックする「バッチ中止」エラーには機能しません。一部のエラーが重大であることは理解していますが、失敗したキャストなどは、SQL Server によってバッチ中止エラーと見なされます。(バッチ エラーに関する情報) これらのエラーが優先度の低いデータで発生した場合に、挿入全体が停止するのを防止しようとしています。

私が説明していることが不可能な場合は、データの整合性を達成するための代替方法を検討しますが、非重要な挿入の失敗は許可します.

ご協力いただきありがとうございます。

4

2 に答える 2

1

残念ながら、あなたが説明したようにはできません(ここでは、ネストされたトランザクションの完全なサポートが重要です)。過去にこれを回避するために使用された、私が考えることができるいくつかのこと:

  1. 最善の選択肢は、おそらくコマンドを重要/重要でないコマンドに分けて、別々に実行できるようにすることです。当然、これには、コマンドが互いに順序に依存しないことが必要です。

  2. また、プライマリ コマンドをインラインで実行し、後で/個別に実行するために非プライマリ コマンドをキューにプッシュする、メッセージング ベースのアプローチ ( Service Brokerを参照) を使用することもできます。キューへのプッシュはバッチ内でトランザクションになりますが、キューからポップするときのコマンドの実行は別になります。これもまた、それらが互いに順序に依存しないことを必要とします。

  3. 順序に依存する場合は、すべてにメッセージング アプローチを使用できます。これにより、順序が保証され、操作ごとに個別のメッセージを持つことができます。次に、(会話グループを介して) それらをグループ化すると、キューから順番に取り出して使用することもできます。操作の「タイプ」ごとに個別のトランザクション (つまり、プライマリと非プライマリ)。グループ化されたすべてのメッセージが単一の自律的な操作でなければならない場合、これには特別なコーディングが必要になりますが、それを行うことができます。

  4. このオプションはひどいオプションであるため、言及することさえ躊躇しますが、完全な開示のために、それが適切であると思われる場合は、あなたの裁量で検討できると思います (ただし、ほとんどすべてのシナリオに適用されるアーキテクチャではないことは間違いありません)。xp_cmdshell を使用してコマンド ラインを呼び出し、重要でないタスクに対して sqlcmd/osql を実行することができます。この sqlcmd の実行は、実行元のモジュールとは別のトランザクションで行われ、xp_cmdshell の失敗を単に無視することで、プライマリ タスクを許可する必要があります。続行するバッチ。

それらはいくつかのアイデアです...

于 2009-11-11T22:29:06.333 に答える
0

重要な部分のみのトランザクションを使用して、一時的な場所にインポートを実行できますか?一時的な場所が読み込まれ、重大ではないエラーが吸収されたら、1回のトランザクションでデータを最終的な宛先にコピーできます。あなたがしている仕事の性質に依存しますが、潜在的に実行可能なオプションです。

于 2009-11-12T04:06:27.070 に答える