오픈 트랜잭션 쿼리가 있는 데이터베이스 찾아보기
현재 오픈된 트랜잭션이 어느 데이터베이스에 있는지 찾는 방법은 여러 가지 있다.
이 활성화된 세션을 찾아야 블로킹세션을 찾을 수 있다.
아래와 같이 세션 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에서 오류 메시지를 출력하면 시스템 관리자에게 문의하십시오.
*/