테이블락은 어떻게 걸리는가?
보통 기본설정의 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
;
'프로그래밍 > 데이터베이스' 카테고리의 다른 글
도커 데스크톱으로 오라클 11G 실행하는 docker-compose.yml (0) | 2024.05.30 |
---|---|
데이터 베이스 설계 문제 #1 (0) | 2023.09.27 |
[논리ERD /물리ERD] 병원-환자-의사 (0) | 2019.12.01 |