생계/MySQL2021. 8. 2. 15:14

mysql 에서는 테이블 조회할때 마다 read lock 을 잡고,

이경우 다른 세션에서 ddl 을 진행할수가 없다. 

 

sudo mysql -uroot -p

create database testdb;

create user 'test'@'%' identified by '1111';
grant all on testdb.* to 'test'@'%';

FLUSH PRIVILEGES;

use testdb

create table aaa ( a int);

insert into aaa values(1);
commit;

 

 터미널 하나를 열고 test 유저로 testdb 에 접속하자.

-- session A (test) 

sudo mysql -utest -p1111

use testdb


select * from aaa;

터미널 하나를 더 열고 ddl 을 진행해보자. 

-- session B (test2)

drop table aaa;

=> drop 이 진행되지 않고 대기상태에 빠짐. 

이 경우에는 

1. A세션 에서 commit;
2. A세션 에서 exit;

하는 식으로 lock 을 해소.

 

mysql 은 오토커밋이 디폴트로 되어있다.

오토커밋 환경에서는 위와 같은 조회만으로 다른 세션에서 ddl 대기가 생길일이 없다.

그러나 실제 운영환경에서는 아마도 오토커밋 안되게 하는 것이 대부분일 것인데  

여기에 익숙치 않으면 종종 이런 일들이 발생할수 있을것 같다. 

오토커밋을 안쓴다면 interactive_timeout 은 필히 바꿀 필요가 있다. 

반응형
Posted by 돌고래트레이너