2016-09-26 3 views
3

프로덕션 SQL Server에서 많은 db 연결이 열려있는 것을 보았습니다. 일부는 매우 오랫동안 연결되었습니다. 이들 중 상당수는 공개 거래가 있습니다. 쿼리에 표시되는 내용 :SQL Server에서 sysprocesses를 오랫동안 열어 두었던 이유는 무엇입니까?

select * from sysprocesses where open_tran>0 

상태가 "sleeping", 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를이 벡에서 일부이며 그것을 만든 응용 프로그램의 호출에서 다음 명령을 기다리고있는 상황입니다 수 있습니다. . 응용 프로그램은 DB 전화를 만들 수 있고 열어 둘 수 있습니다. 열 수 있고 닫을 수 있습니다. 많은 나쁜 웹 코더가 dbs를 열고 닫지 않으며 알림을 닫는 데 시간이 걸립니다. – BugFinder

답변

3

.

이 연결이 활성화되어 의미 수면 상태로의 sysprocesses의 행을 볼 수 있지만 used..This을되지 않는 것은 또한 SQLServer에 의해 사용 connection Pooling mechanism로 인해 발생

..

대기 명령 할 수있다 당신이 체 할 때 이제이 거래

begin tran 
insert into sometable 
select some columns 

를 시작

세션 1은 .. 예를 아래에 의해 설명 될 sys.processes/session DMV에서 session1의 상태를 확인하면 명령 대기 중임을 알 수 있습니다. 커밋하지 않았습니다.

당신이 트랜잭션을 시작하고

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

같은 사용자 입력을 기다립니다 그리고 아무것도 차단중인 경우는, 문제가있는 경우 일 수있다 명령을 기다리는 또 하나의 이유는?

는만큼 당신이 보는 바와 같이 ..

아무것도 자고 세션이 어떤 잠금을 보유하지 않는 차단되지 않으며, 당신은 당신이 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 절전/대기 명령으로 열린 트랜잭션이 생겼습니다. 상황이 다른 많은 변형에 의해 발생하지만 항상 SQL 서버가 클라이언트