-
우선 알아보기전에 InnoDB에 대해 알아보자
InnoDb란 스토리지 엔진이다. 검색해보니 MyISAM과 많이 비교하고 있다. 나도 비교하면서 보겠다.
MyISAM : MyISAM은 ISAM(indexed Sequential Access Method)의 업그레이드 버전으로 non-transactional-safe테이블을 관리
모델디자인이 단순하다는게 장점이라서 전체적인 속도가 InnoDB보다 빠른데 특히 select 속도가 빨라 읽기 작업에 적합하다.
하지만
-데이터 무결성이 보장되지 않는다.
-트랜잭션 지원이 없다. ( 문제가 생겨도 데이터 입력을 그냥 해버린다 ;; )
-table-level-lock을 지원해 insert update등의 쓰기 속도가 느리다.
결론적으로 MyISAM은 읽기만 필요한 작업일경우에 사용된다.
InnoDB : 트랜잭션을 지원해 transaction-safe테이블 관리
트랜잭션을 지원하기때문에 commit, rollback, 장애복구,row-level locking,외래키등 다양한 기능을 지원한다.
장점으로
-데이터 무결성이 보장된다.
-동시성 제어가 가능하다
-제약조건,외래키 생성이 가능하다
-row-level lock을 사용해 변경작업이 속도가 빠르다
하지만
-여러기능이 있다보니 모델디자인 시간이 많이 걸린다
-시스템 자원을 많이 잡아먹는다
결론적으로 InnoDB는 데이터 변경이 빈번하고 대용량 데이터일때 사용된다.
lock
위의 글을 읽다보니 든 생각은 그렇다면 InnoDB는 자동으로 레코드접근시 다른 사용자의 접근으로부터 자동 lock이라는걸까?
기본적인 lock의 개념을 알아보자
기본적으로 lock설정이라하면 특정 table을 사용하고 있는 상황에서 다른 접속자의 접근 차단기능이다.
-read lock은 다른사용자는 읽기만할 수 있다.
-write lock은 다른사용자는 접근도 못한다.
결론적으로 InnoDB는
-row 레벨 lock을 사용하며 쿼리 수행시 락을 유발하지 않는 consistent읽기 방식을 이용한다.
-락 정보는 매우 공간 효율적으로 저장되기 때문에 lock 에스컬레이션이 필요없다.
여기 확실한 예제가 있다.
InnoDB는 두가지의 표중 row-level rock을 구현하고 있다.
-Shared lock :트랜잭션이 row 읽기를 허용
-Exclusive lock :트랜잭션이 update,delte 허용
상황 : 트랜잭션 T1과 T2가 있다. 만약에 T1이 row r에 대해서 Shared lock을 가지고 있다
요청: T2가 row r에 대해 shared lock을 요청했다.
결과 : 즉시 락을 얻었다.
결론 : T1,T2 모두 shared lock을 가지고있다.
요청: T2가 row r에 Exclusive lock을 요청했다.
결과 : 즉시 락을 얻지 못했다.
결론 : T2는 대기한다.
요청: T1이 row r에 대해 Exclusive lcok을 얻었다.
결과: T2는 shared,Exclusive lock 둘 다 즉시 얻을 수 없다.
결론: T2는 대기한다.
더 확실한 예제가 있다.
1.table을 하나 생성했다.
create table messages( id int auto_increment primary key, message varchar(140)) engine=InnoDB
2. lock을 걸어둔뒤 다른 곳에서 쿼리를 날려보면 안되는걸 볼 수 있다.
프로세스 상태를 확인할 수 있다.
이제 첫번째 세션에서 두번째 세션에서 하려던 쿼리를 날려보자 대기하려던 세션2는 없는걸 삭제하려했기때문에 dead lcok이 걸린다.
결론적으로 어떤 스토리지 엔진을 사용하느냐에 따라 lock이 설정된다.
출처url
https://wwarchblog.wordpress.com/2016/04/06/ch14-3-innodb-transaction-model-and-locking/
'2017년 > Database' 카테고리의 다른 글
sqlalchemy relationship (2) 2017.08.29 mysql 프로시저,함수,트리거,커서 (1) 2017.08.15 sqlite에서 지원하지 않는! 것들! (0) 2017.08.10 python orm sqlalchemy를 써보자[1.1.x]기준 2부 (0) 2017.08.06 ggplot에 대해 알아보자 (0) 2017.08.04