본문 바로가기

MYSQL강좌정리

18차 트랜잭션, 락(Lock), 격리수준

Transaction : ALL or Nothing  -> 전체수행(commit) 과 전체취소(rollback) 두가지 결과값만 있음

 

기본적으로 SQL의 수행모드는 AutoCommit 모드임 (줄단위 커밋모드)

트랜잭션을 지원하기 위해서는 AutoCommit 모드를 off시켜야 함

트랜잭션은 InnoDB 스토리지엔진만 가능함

 

트랜잭션 : ACID 특성

Atomicity(원자성) All or Nothing

Consistency(일관성) : 데이터의 일관성

Isolation(고립성/격리수준) : 

지속성(Durability)

 

트랜잭션 기본설정 확인

select @@autocommit;   1이면 true 이고 0이면 false임

set autocommit = false; --> autocommit OFF

 

Lock 에 대하여

공유자원에 대해 여러 트랜잭션이 접근하려고 경쟁할때 제어하는 방법

일관성과 무결성을 지키기 위해 적용

테이블단위 락 : 동일한 테이블을 다른 트랜잭션이 사용하고 있다면 접근금지 --> MyISAM

줄단위 락 : 동일한 줄(Row)만 접근금지(테이블락보다 높은 성능) --> InnoDB

 

기본스토리지 엔진이 무엇인지 확인하자

select engine, support from information_schema.engines where support='DEFAULT';

set default_storage_engine=InnoDB;

영구적으로 바꾸려면 my.ini 수정하고 DB재기동

 

Isolation(격리)에 대하여

1) read uncommitted : 트랜잭션이 처리되는 도중에 다른 트랜잭션이 해당 데이터를 읽기를 허용(uncommitted data)

성능은 높지만 데이터의 안정성이 떨어짐(다른 트랜잭션이 읽어간 값이 틀린값일 수 있음)

2) read committed : 트랜잭션이 끝난 이후에만 접근하도록 허용(committed data) -> 일반적으로 많이 사용됨(Oracle)

이 방식은 commit이전의 값이 읽히게 되며, 타트랜잭션이 commit하게되면 읽는 값이 바뀔수 있다.

즉 동일트랜잭션이 동일select쿼리를 여러번 수행시 값이 바뀔수 있다. 아래 repeatable이 이 문제를 개선한것임

3) repeatable read : 다른 트랜잭션이 업데이트하는 것은 금지하지만 레코드 추가하는 것은 허용

2번과 4번 사이임.. MySQL의 기본방식임

한 트랜잭션이 어떤 값을 읽었는데 1이라치자. 근데 다른 트랜잭션이 들어와서 이 값을 2로 바꾸고 commit까지 했다면??

read committed의 경우 원래트랜잭션이 1이라 읽었는데, 좀있다 다시 읽으면 2로 읽히게 된다.

하지만 repeatable의 경우는 첨에 읽었던 1을 기억하고 있다가(캐싱) 그 트랜잭션이 다시 읽어도 1을 준다. 

 

4) serializable : 트랜잭션이 동시에 수행되는 것이 금지되고 순차적으로 수행됨

데이터는 절대적으로 깨지지않고 정확함, 성능이 많이 떨어지고 안정성은 높아짐

 

기본 트랜잭션 격리수준 확인

select @@tx_isolation;

set tx_isolation = 'READ-COMMITED'; --> 이렇게 바꾸면 성능이 약간 더 좋아짐(안정성은 약간 떨어짐)

commit;