우아한 프로그래밍

테이블락은 어떻게 걸리는가?

보통 기본설정의 Rdbms는 Select문을 제외하고 Delete/Update/Insert문에 대해서 테이블 락을 걸게됩니다.

가령 A라는 사람이 Delete Table;의 명령문을 실행한 상태에서 커밋을 치지않는 다면 해당커넥션이 아닌 다른 커넥션

즉 B,C,D라는 사람은 해당테이블에 Select를 제외한 Delete/Update/Insert을 수행할 수 없습니다.

그럼 B,C,D라는 사람이 Delete/Update/Insert문을 수행하게되면 테이블 Lock키를 얻기위해 무한대기에 빠지게됩니다. 

이 무한락을 해제하는 방법은 A라는 사람이 Lock을 해제하는것이죠 ( 커밋을 치거나 롤백을 하거나)

그러나 A라는 사람은 모른다고합니다. 그럼 A가 실행시킨 구문을 직접 킬시켜야합니다.

 

사용방법

-- 모든 프로세스 조회
SHOW FULL PROCESSLIST;
-- 락테이블 조회
select * from information_schema.innodb_locks;
-- 대기중인 락 조회
select * from information_schema.innodb_lock_waits;
-- 트랜젝션조회
select * FROM information_schema.INNODB_TRX;

-- 해당 프로세스 종료
kill 495299;

-- 종합쿼리
SELECT * FROM information_schema.`PROCESSLIST`
WHERE Command <> 'Sleep'
AND USER NOT IN ('system user', 'event_scheduler')
ORDER BY TIME DESC
;

 

profile

우아한 프로그래밍

@자바조아!

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!