QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

[ASP.NET]SQL実行時エラー「SqlTransactionは完了しています」

いつもお世話になってますm(_ _)m

今日は皆さんのお知恵をお借りしたくて書き込みました。

【環境】
ASP.NET(VB.NET)
DB:MSDE2000

現在、現地環境でDBの更新処理が走るときにエラーが起きています。
ただ、ログを見ると毎回起きているわけではなくて1日に1回あるかないかぐらいで起きているようです。
エラーの内容としては
「この SqlTransaction は完了しています。再度使用することはできません。」
です。
なんとか、こちらの開発環境でも再現させたいのですが再現させる条件がわからず
困っている状況です。
ネットワークケーブルを試しに抜いて、再度さして実行すると、ネットワークエラーにより、上記のメッセージが出るのですが、現実的な原因とは言えません。

そこで、どなたか同じようなエラーメッセージが出たことがある方がいらっしゃいましたら、どんな些細な情報でもよいのでお手数ですが教えていただけないでしょうか。

ちなみに、SQLの実行は
System.Data.SqlClient.SqlCommand.ExecuteReader()
を使用しています。

宜しくお願い致します。

質問者:新人S

回答

さかもとと申します。

同じようなメッセージは環境が異なりますが良くでます。
私の場合、原因は単なるロジック上のミス。

推測ですが、環境絡みの問題ではないと思います。
どこかでイレギュラーなデータが出ているとか、例外処理でロジック上何か問題があるのか、トランザクションの管理がうまくいっていないとか、などそちらから追っていく必要があるかと。

追記:仮にネットワークに問題があるとすれば(瞬断など)スニファーなどで1週間くらいログを取るのも良いかと。

[ メッセージ編集済み 編集者: さかもと 編集日時 2006-09-27 16:46 ]

投稿者:さかもと

編集 履歴 (0)

ConnectionやTransactionをスレッドで共有してしまっているとか。
こういうのってある程度リクエストが集中しないと発生しないので、開発中には
気づかないことがあります。

単純なミスだとすると、Commit/RollbackしたTransactionに再度Commit/Rollbackを
かけてしまっているとか。異常処理のテストが抜けていた場合にテストでは通らな
かったロジックパスを通った場合に発生することがあります。

投稿者:uk

編集 履歴 (0)

Transactionは狭く使うのが基本。
使いまわしは厳禁。使いまわす意味もないし。
_________________質問する前にググレカス

投稿者:ぶさいくろう

編集 履歴 (0)

さかもとさん、ukさん返信ありがとうございますm(_ _)m

今、ソースを見直している状況なのですが、
確かにご指摘のとおりExceptionが発生した際にRollbackが2回走っているところがありました。
(なぜ、Exceptionが起きているかはまた別の問題なのでしょうが。。)
しかし、現状出ているログはRollBackやCommitが2回走ったときとは違うログの出方をしているのでRollback以外にも問題はまだありそうです。

ukさんがおっしゃった、
>ConnectionやTransactionをスレッドで共有してしまっているとか。
>こういうのってある程度リクエストが集中しないと発生しないので、開発中には
>気づかないことがあります。

についてですが、
確認する方法としては、複数台のPCで登録処理をするといったかんじなのでしょうか。
勉強不足で申し訳ないのですが、同じスレッドを共有しているのかということがどうやったら知ることができるのかがわからなくて。。
デバッグで何かの値を見て確認することも可能でしょうか?

質問ばかりで申し訳ありませんが、もし差し支えなければ教えていただけないでしょうかm(_ _)m

以上です、宜しくお願い致しますm(_ _)m

投稿者:新人S

編集 履歴 (0)

すみません、返信がいきちがってしまいました。
ぶさいくろうさん返信ありがとうございますm(_ _)m

おっしゃるとおり、質問ばかりになっていましたm(_ _)m
提示する情報が少なくては返信してくれる皆様もアドバイスしづらかったと思います。

試したこととしては、ネットワークを切断したり、ソースを解析したりといったかんじです。ネットワークに関してはどうも的はずれなかんじがしましたので現在はソース解析にしぼっています。

投稿者:新人S

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。