2016-09-26 13 views
3

プロダクションSQL Serverで多数のDB接続が残っていることがわかりました。これらの多くは公開取引を行っています。クエリに表示されるとおり:SQL Serverでsysprocessesを長時間開いているのはなぜですか?

select * from sysprocesses where open_tran>0 

ステータスが「スリープ中」、cmd =「AWAITING COMMAND」です。

For<ISessionFactory>().Singleton() 
    .Use(() => DataContext.GetSessionFactory()); 

For<ISession>().Transient() 
    .Use(context => context.GetInstance<ISessionFactory>().OpenSession()); 

いくつかのセッションは、トランザクションスコープを使用します:次のように

接続がNHibernateはを使用して開かれ _transactionScope =新しいのTransactionScopeを();

いくつかは、トランザクションを作成します。

_uncommittedTransaction = SessionUncommittedWrapper.Session.BeginTransaction(IsolationLevel.ReadUncommitted); 

取引および/またはのTransactionScopeは、その後に配置されています。

なぜ接続はまだ開いていますか?何もブロックされていなければ、それは問題ですか?

+0

を待っている状況です。アプリケーションはdbコールを作成してオープンにしたり、オープンしたり、オープンしたりすることができます。多くの悪いWebコーダーがdbsをオープンし、クローズしないようにします。 – BugFinder

答えて

1

NHibernateに基づくdoc

Hibernateは、 接続プーリングのADO.NETデータプロバイダの実装に依存しています。

オープンされた接続を再利用して接続すると、パフォーマンスが向上します。

さらに詳しい情報:= cmdは= "COMMANDを待っている"、 "眠っている" 彼らは状況にある

3

あなたが眠っているの状態とのsysprocesses内の行を見ると、それはこの接続がアクティブであることを意味するだけでなく、used..ThisされていないことによるのSQLServerで使用connection Pooling mechanismに起こる。..

コマンドを待ちすることができます例えば、以下で説明する。..

セッション1:あなたCHE今

begin tran 
insert into sometable 
select some columns 

このトランザクションを開始ck sys.processes/session DMVのsession1の状態を見ると、待っているcommand..sinceとして、それをコミットしていないことがわかります。あなたが取引を開始し、ユーザの入力を待つ

begin tran 
update t 
set t1.a=<<some input from user>>--waiting 
where t1.a=oldvalue 
commit 

のように、何がブロックされていない場合には、問題となっているときにコマンドを待っているの

もう一つの理由は、することができますか?

限り、あなたは見るように、何も眠っていると、セッションがロックを保持していないとあなたが開いているすべてのトランザクションが表示されていない、ブロックされていない、あなたはworry.Thisする必要はありませんBob Dorr in this articleによって説明される。..

この問題は、通常、ロックを保持しているセッションで発生し、その状態はスリープ/待機コマンドです。クライアントにオープントランザクションがあり、クライアントがコミットまたはロールバックコマンドを発行しなかった場合、状態はスリープ/待機中のコマンドです。私はこれを非常に頻繁に、タイムアウトする手順を参照してください。クライアントは、それが実行をキャンセル "したかったし、それ以上の処理を行いません示されたため、トランザクションが開いたままになります30秒のクエリのタイムアウトをクライアントから実行

Create proc myProc 
As 
Begin tran 
Update authors …. 
Waitfor delay ’10:00:00’ — time out will occur here (simulates long workload) 
rollback 
go 

この状況で自動ロールバックを取得するには、トランザクションのアボートを有効にする必要があります。これで、SPID sleeping/awaitingコマンドで開いているトランザクションができました。 状況は、多くの他の変形が原因で発生することができますが、DBは、部分的にベックとそれを作ったアプリの呼び出しでは常にSQL Serverは、クライアントからの次のコマンドを

関連する問題