본 게시물은 개인적인 의견으로 작성되었으니 절대적인 정보가 아닐 수 있습니다. 참고만 하시고 궁금한 사항이 있으시면 연락주세요.

티스토리 뷰

현재 오픈된 트랜잭션이 어느 데이터베이스에 있는지 찾는 방법은 여러 가지 있다.

이 활성화된 세션을 찾아야 블로킹세션을 찾을 수 있다.

아래와 같이 세션 2개를 열어서 확인해보자


-- session #1 tempdb 를 열고 실제 데이터베이스는 TD 에 있는 테이블을 업데이트 하고 있다.

use tempdb

go

 

begin tran

update A set diff = '1' from td.[dbo].[results] a

-- rollback

 

-- session #2

use tempdb

go

DBCC OPENTRAN

세션#1에서 tempdb를 오픈하고 Update를 하지만 실제는 TD 를 하고 있는 것을 찾아야 된다.

 

 

SELECT spid, dbid FROM SYS.SYSPROCESSES WHERE OPEN_TRAN = 1

select db_name(2)

 

현재 세션정보를 보면 tempdb 로 확인이 된다. 혹시나 오픈된 데이터베이스가 tempdb로 착각하면 안된다.

 

SELECT * FROM SYS.DM_TRAN_SESSION_TRANSACTIONS

 

 

위에서는 정말 잘못된 데이터베이스를 찾을수 있다. 실수하기 좋은 예이다.

실제 오픈 트랜잭션이 발생중인 데이터베이스를 찾으려면 sp_lock 으로 확인해보자.

sp_lock

 

select db_name(9) as DBName

 

/*

DBName

TD

*/

 

use TD 실제 오픈 트랜잭션이 있는 데이터베이스에서 DBCC OPENTRAN을 수행해야 결과를 볼 수 있다

go

DBCC OPENTRAN

/*

SQL Server 실행 시간:

CPU 시간 = 0ms, 경과 시간 = 0ms

SQL Server 구문 분석 및 컴파일 시간:

CPU 시간 = 0ms, 경과 시간 = 0ms.

데이터베이스 'TD'의 트랜잭션 정보입니다.

 

가장 오래 전에 활성화된 트랜잭션:

SPID(서버 프로세스 ID): 54

UID(사용자 ID) : -1

이름 : user_transaction

LSN : (43:56:5)

시작 시간 : 09 14 2015 1:27:39:913PM

SID : 0x010500000000000515000000301322d263e67671bfb9b84833150000

DBCC 실행이 완료되었습니다. DBCC에서 오류 메시지를 출력하면 시스템 관리자에게 문의하십시오.

*/

댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
Total
Today
Yesterday