2009年2月27日 更新
SQL CLR で、TransactionScope
SQL CLR で、TransactionScope を使用している。
ひとつの SQL CLR から いくつかの SQL CLR を 呼び出して処理しているのだが、
ループで何度も同じブツを呼び出すと以下のエラーが出た。
——————————————————————————–
System.Data.SqlClient.SqlException: 現在のトランザクションのコミットおよび
ログ ファイルに書き込む操作はサポートできません。
トランザクションをロールバックしてください。
場所 System.Data.SqlClient.SqlConnection.OnError(SqlException exception,
Boolean breakConnection)
場所 System.Data.SqlClient.SqlCommand.RunExecuteNonQuerySmi(Boolean sendToPipe)
場所 System.Data.SqlClient.SqlCommand.InternalExceptionNonQuery
(DbAsyncResult result, String methodName, Boolean sendToPipe)
場所 System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
場所 XXX99999.StoredProcedures.XXX99999()
メッセージ 3991、レベル 16、状態 1、プロシージャ XXX99999、行 0
ユーザー定義のルーチン、トリガ、または集計 “XXX99999” を入力する前は
アクティブであったコンテキスト トランザクションが内部で終了しました。
このような動作は許可されません。
厳密なトランザクションの入れ子を設定するようにアプリケーションのロジックを変更してください。
——————————————————————————–
・・・。
アプリケーションのロジックを変更してください、なんてメッセージが
返ってくるなんて、時代も変わりましたね。
いまいち意味が分からないけれど、
エラーでアベンドする場所が、実行するたびに変わるので
これはプログラム自体の不具合では無さそう。
というわけで、暗黙なトランザクションではなく、【厳密】なトランザクションを目指して
System.Data.SqlClient.SqlTransaction を使用する方法に直してみました。
はい、エラー回避です。
これって、コアな処理では、TransactionScope 使っちゃいけない、ってこと??
投稿者:K・K
山梨県へ嫁ぎ、在宅でお仕事させて頂いています。言葉や風習の異なる 土地は、驚きも多いですが楽しく過ごしています♪富士山だけでなく、ほうとう・桃・葡萄・温泉などいろいろ楽しいモノがあるので、ぜひ一度遊びに来てください!