2016-09-26 6 views
3

Я заметил, что множество подключений db осталось открытым на моем выпуске SQL Server, некоторые в течение очень долгого времени. Многие из них имеют открытую транзакцию. Как видно из запроса:Почему sysprocesses остается открытым на SQL Server в течение длительного времени?

select * from sysprocesses where open_tran>0 

Статус: = "sleeping", cmd = "AWAITING COMMAND".

Соединения открываются с помощью NHibernate следующим образом:

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

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

Некоторые сеансы использовать область транзакции: _transactionScope = новый TransactionScope();

Некоторые из них создают сделку:

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

Транзакция и/или TransactionScope расположены впоследствии.

Почему соединения все еще открыты? И это проблема, если ничего не блокируется?

+0

ДБ частично на побегушках приложения, которые сделали это. приложение может сделать вызов db и оставить его открытым или открыть, сделать и закрыть .. многие плохие веб-кодеры открывают dbs, а не закрывают их, и требуется некоторое время, чтобы закрыть его – BugFinder

ответ

1

Основано на NHibernate doc.

Hibernate полагается на реализацию поставщика данных ADO.NET пула соединений.

Соединения являются открытыми, чтобы повторное использование открытых соединений улучшило производительность.

Подробнее:

3

Они находятся в состоянии = "спит", CMD = "ОЖИДАЕТ КОМАНДУ".

, когда вы видите строку в sysprocesses со статусом сна, это означает, что данное соединение активно, но не будучи used..This также происходит из-за connection Pooling mechanism используется SQLServer ..

Ожидание команды может объясняется ниже пример ..

сессия 1: начать эту сделку

begin tran 
insert into sometable 
select some columns 

Теперь, когда вы че ck статус session1 в sys.processes/session DMV, вы можете видеть это как команду ожидания, так как вы ее не совершили.

Еще одна причина в ожидании команды может быть, когда вы начинаете сделку и ждать ввода пользователя как

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

И это проблема, если ничего не блокируется?

Пока вы видите, ничего не блокируется, спать и сеансы не держит никаких блокировок и вы не видите никаких открытых транзакций, вам не нужно worry.This объясняется Bob Dorr in this article ..

Вопрос обычно возникает вокруг сеанса, который удерживает блокировки, и его состояние является спящим/ожидающим. Если клиент имеет открытую транзакцию и клиент не отправил команду фиксации или отката, состояние будет спящей/ожидающей команды. Я вижу это довольно часто с процедурой, которая временами.

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

При запуске от клиента с 30-секундным тайм-аут запроса транзакция будет оставаться открытым, так как клиент указал, что хочет «отменить выполнение» и не делает никакой дальнейшей обработки.

Чтобы получить автоматический откат в этой ситуации, транзакция прерывания должна быть включена. Теперь у вас открытая транзакция с командой SPID sleep/awaiting. ситуация может быть вызвана многими другими вариациями, но это всегда ситуация, когда SQL Server ожидает следующей команды от клиента

 Смежные вопросы

  • Нет связанных вопросов^_^