mysql deadlock# DataBase/Mysql(MariaDB)2021. 12. 23. 13:30
Table of Contents
728x90
반응형
mysql InnoDB Lock 종류
Shared lock (S) | Row-level lock SELECT 위한 read lock shared lock이 걸려있는 동안 다른 트랜잭션이 해당 row에 대해 X lock 획득(exclusive write)은 불가능하지만 S lock 획득(shared read)은 가능 한 row에 대해 여러 트랜잭션이 동시에 S lock을 획득 가능 |
Exclusive lock (X) | Row-level lock UPDATE, DELETE 위한 write lock exclusive lock이 걸려있으면 다른 트랜잭션이 해당 row에 대해 X, S lock을 모두 획득하지 못하고 대기해야 한다. |
Intention lock | Table-level lock 테이블 안의 “row에 대해서 나중에 어떤 row-level락을 걸 것”이라는 의도를 알려주기 위해 미리 table-level에 걸어두는 lock SELECT ... LOCK IN SHARE MODE 이 실행되면, - 먼저 intention shared lock (IS) 이 테이블에 걸림. - 그 후 row-level에 S lock이 걸림 SELECT ... FOR UPDATE, INSERT, DELETE, UPDATE 이 실행되면, - 먼저 intention exclusive lock (IX) 이 테이블에 걸림. - 그 후 row-level에 X lock이 걸림. IS, IX 락은 여러 트랜잭션에서 동시에 접근이 가능하다 (서로 block하지 않는다). 하지만 동일한 row에 row-level의 실제 lock (S 또는 X)을 획득하는 과정에서 동시 접근을 막거나 허용하는 제어를 하게된다. LOCK TABLES, ALTER TABLE, DROP TABLE 이 실행될 때는 IS, IX 를 모두 block하는 table-level 락이 걸린다. 즉 IS, IX lock 을 획득 하려는 트랜잭션은 대기상태로 빠짐 반대로 IS, IX 락이 이미 걸려있는 테이블에 위의 쿼리를 실행하면 를 실행하면 해당 트랜잭션이 대기상태로 빠짐. Table-level에서 한번, row-level에서 한번, 2단계(2-phase)로 lock을 적용하는 이유? A 트랜잭션에서 이미 테이블에 대해 락이 걸려있는데, B 트랜잭션에서 해당 테이블의 특정 row에 lock을 거는것을 원천적으로 방지 할 수 있다. (반대의 경우도 마찬가지) 예) row-level의 write이 일어나고 있을때 테이블 스키마가 변경되서는 안된다. write query의 경우 이미 IX 락을 획득한 상태이기 때문에 해당 테이블의 스키마가 변경되는것을 막을 수 있다. |
데드락 상태 확인
SHOW ENGINE INNODB STATUS;
------- TRX HAS BEEN WAITING 5 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 770 page no 3 n bits 80 index PRIMARY of table `example_db`.`test` trx id 774317 lock_mode X locks rec but not gap waiting
# 현재 lock 상태확인
select * from information_schema.innodb_locks;
# lock 대기정보
select * from information_schema.innodb_lock_waits;
# innodb 트렌젝션 상태 확인. 종료되지 않고 지속적으로 나타날 경우 확인 필요.
# thred_id로 pid 확인
select * from information_schema.innodb_trx;
# lock걸린 프로세스와 일치하는지 확인
show processlist;
select * from information_schema.processlist where id = [pid];
# 프로세스 죽이기
kill [pid]
https://www.letmecompile.com/mysql-innodb-lock-deadlock/
https://www.popit.kr/mysql-lock-%EC%83%81%ED%99%A9-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0/
728x90
반응형
'# DataBase > Mysql(MariaDB)' 카테고리의 다른 글
mariaDB password 복잡도 설정 (0) | 2022.03.29 |
---|---|
mysql characterset 확인 및 수정 (0) | 2022.01.26 |
mysql 기간별 select query(현재기준) (0) | 2021.09.09 |
mysql show processlist 쓰레드 실시간 정보 (0) | 2021.06.29 |
mariadb galera clustering (0) | 2021.06.24 |
@다크쉐라빔 :: 다크쉐라빔의 주절주절
안녕하세요. 이곳은 IT위주의 잡다한 정보를 올려두는 개인 블로그입니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!