ASP.netのWebアプリケーションで、下記のエラーが多発して困っています。
「System.Data.SqlClient.SqlException: サーバーはトランザクションを再開できませんでした。説明: 4500000284。
このセッションでアクティブなトランザクションが、別のセッションによりコミットまたは中止されました。」
タイミング的には、アクセス負荷が高まったときに発生しているようなのですが、
そもそも、直接な原因として、どういう場合に上記のエラーが発生するのかが分かっていないため、
どう対処すればいいか見当がつかない状態です。
このエラーの発生原因・対処法について、何らかの情報があれば提供お願いします。
コメント(3件)
そのアプリケーションの基本設計が悪いか、あるいは造りが悪い
あるいは、そのアプリケーションの仕様が実情と合っていない
ハードウェアやOSの処理限界などもあるかもしれない
総合的に見ていかないといけないから、誰も答えられない
(難しい問題なので、なんちゃって回答者が寄り付いていないのが不幸中の幸いかもしれない)
お立場によって下記のような対応がまず第一となるでしょう
Webアプリケーションを作成している立場であるならば、
「1トランザクションを出来るだけコンパクトに実行できるように見直し」
Webアプリケーションを利用している立場であるならば、
「ソフトウェア、ハードウェアの仕様上の限界と実際の限界についての情報収集」
以上、ざっくりとしか書けないのでコメントにしておきます
>そのアプリケーションの基本設計が悪いか、あるいは造りが悪い
正直私もそう思うんですよね…。
>総合的に見ていかないといけないから、誰も答えられない
たしかに根本的な解決(対症療法含めても)はこの情報でアドバイスするのは難しいでしょうし、
ただ、総合的に判断できるような情報を出すというのはプログラムの基本部分を公開する必要があるため
今回のプロジェクトでは難しいというのが正直なところです。
なので、上記エラーの「直接的な」原因が分かればプログラム見直しの手助けになるかなという
思いで今回の質問を行っています。
とりあえず
> Webアプリケーションを作成している立場であるならば、
> 「1トランザクションを出来るだけコンパクトに実行できるように見直し」
を再度確認しようかと思います。
いいかげんなものでよければ、OSやサーバーの構成、クライアントの数、更新系か参照系(更新系だと思ってます)などの大まかな概要でも答えをある程度絞れるかもしれませんが、それとても結果的に深い部分にまで言及することになるかもしれませんので、いずれにしても詳しい部分を表に出すことになろうかとは思います
トランザクションの見直しを行うにあたって、既にやっておられるかもしれませんが、せめてもの追加ヒントとして次のように切り分けることだけを追記しておきます
(1)エラーは出るけれどデータは正しくコミットされている
自動でコミットされてしまう原因を探りをいれる
(2)エラーの出たときのセッションは中止され、データベースにデータは反映されない
どのアプリがセッション切れを起こす要因になっているかなどから探りをいれる