0

挿入、更新、作成などのコマンドがあり、SQLインスタンスのデータベースで実行したいと考えています。これにはトランザクションスコープを使用しており、エラーが発生した場合でも、すべてのデータベースですべてのコマンドを実行したいと考えています。エラーが発生した場合は、適切なコマンドを実行せずにすべてのエラーをユーザーに表示したいと思います。ただし、トランザクションで最初のエラーに達すると、ロールバックされ、他のコマンドの実行を続行できなくなります。私のコマンドは次のようなものです:

using Trans as new TransactionScope

con.open()

for i as integer = 0 to n

Try
    com.commandtext = coms(i)
    com.executenonquery()

catch ex as exception
    errorCollection.add(ex.message) 
    continue for

end try

next

end using
4

2 に答える 2

2

トランザクションが機能する方法は、SQLServerが実際に発生したエラーを追跡していることです。トランザクションでエラーが発生した場合、SQL Serverはトランザクションに障害があると宣言し、同じトランザクションでそれ以上の表彰を送信することを許可しません。したがって、SQLエラーがアプリケーションのtry / catchブロックによって処理された場合でも、トランザクションはSQL Serverですでに失敗しているため、次のコマンドを送信すると失敗します。

唯一の実行可能なオプションは、基本的にトランザクション内の各コマンドを実行してから、失敗して成功するかどうかに関係なく、コマンドをロールバックすることです。すべてが成功した場合は、それらすべてを1つの大きなトランザクションで実行し、それをコミットできます。ただし、これは完全に独立している場合にのみ機能します。

最善の選択肢はおそらくそれを回避することです。基本的には、最初のエラーしか発生しない可能性があることを受け入れます。

于 2013-01-21T10:36:33.333 に答える
2

例外処理を SQL に移動します。「例外処理とネストされたトランザクション」を参照してください。安全に処理できる例外と、さらに発生させる必要がある例外、安全に無視できる例外を決定します。例外の大部分は無視できません。無視される可能性があるものであっても、大多数は、データの一貫性を失わないように、トランザクション コンテキスト全体を考慮する必要があります。すべての例外がセーブポイントへのロールバックで処理できるわけではないことに注意してください。特定の例外は、トランザクションが既に破棄された後に発生します (例: デッドロック)。

全体として、私はあなたの要件を非常に悪い判断のアイデアのカテゴリに分類します.

于 2013-01-21T10:51:04.640 に答える