2010년 7월 7일 수요일

[MySQL 아키텍처]Lock & Transaction

트랜잭션이란 무엇인가?

 - ACID 기준으로 정의된다.
  Atomic - 원자성, 하나의 작업단위로 하나의 명령으로 수행되거나 모두 수행되지 않아야 함
  Consistency - 일관성, 트랜잭션전 후에 모두 일관된 데이터여야 함
  Isolation - 분리성, 트랜잭션은 다른 트랜잭션과 완전하게 분리되어야 함
  Durablity - 완전성, 처리완료된 트랜잭션은 영구적으로 보존되어야 함

 

 

MySQL에서의 트랜잭션
 - AUTOCOMMIT옵션은 트랜잭션을 어떻게 묶을까 결정됨(기본은 설정)
 - AUTOCOMMIT=1(Default)
   예외는 BEGIN 또는 BEGIN WORK로 시작하고 COMMIT나 ROLLBACK를 완료해야함
 - AUTOCOMMIT=0
   각각의 COMMIT또는 ROLLBACK는 하나의 트랜젹션을 완료하며 동시에 새로운 트랜잭션을 시작

 


스토리지 엔진별 트랜잭션 지원
 - InnoDB : Row레벨 락킹, Select는 락없이 수행, 테이블별 테이블스페이스 사용가능
 - BDB : 페이지 레벨 락킹, 테이블별 하나의 파일
 - MyISAM : 지원안함
 - NDB Cluster : Row레벨 락킹, 클러스터 테이블

 

 

락킹이란 무엇인가?
 - 데이터에 대한 동시접근을 제어
   UPDATE는 READ를 제한함, 락의 종류에 따라 성능,일관성 차이
 - 각각의 스토리지 엔진은 락킹에 관련한 각각의 알고리즘 보유

 

 

락의 종류
 - 테이블레벨 락킹(MyISAM,Memory) : 업데이트 중 테이블의 접근 불가
 - 페이지레벨 락킹(BDB) : 업데이트 중 동일 테이블 해당 페이지 접근 불가
 - Row레벨 락킹(InnoDB, NDB) : Commit전에는 해당 Row에 접근 불가

 

 

락의 특성 비교
 - 테이블레벨 락킹 장점
   오버해드가 적음,매우 빠른 읽기,데드락이 없음,읽기가 많고 키 기반 업데이트 어플리케이션에 적합
 - 테이블레벨 락킹 단점
   트랙잭션 지원불가, UDATE가 많으면 성능 저하


 - Row레벨 락킹의 장점
   동접이 많아도 충돌이 없음, 롤백을하는 경우 변경이 적음, 좀 더 긴시간 락 설정 가능, 변화가 많은 어플리케이션에 적합
 - Row레벨 락킹의 단점
   메모리양의 따라 성능 영향받음, 많은 ROW작업시 느림, GROUP BY와 테이블스캔 성능이 낮음, 데드락 발생 가능성 있음

 

 

MyISAM의 트랜잭션과 락킹
 - 트랜잭션 지원안함, 즉각 커밋
 - WRITE 또는 READ 락 사용
 - LOCK가 이미 걸려 있으면 LockQueue이용
 - WRITE가 우선권
 - 많은 경우 락킹없이 INSERT와 SELECT 사용 가능(충돌이 없다고 판단 되면 동시 수행)

 

 

MyISAM의 테이블락킹
 - LOCK TABLES를 통해서 수동으로 걸수 있음
 - LOCK가 걸린 테이블은 UNLOCK TABLES를 쓰거나 쓰레드가 죽지 않는한 유지
 - READ Lock가 걸리면 어떠한 내용도 쓸수 없음(읽기는 가능)
 - READ LOCAL LOCK은 충돌이 없을 경우 INSERT LOCK이 있어도 처리 가능
 - WRITE LOCK는 LOCK를 걸고 있는 쓰레드만이 테이블에 접근 가능(UPDATE시)

 

 

InnoDB의 트랙잭션 MVCC(Multiversion Concurrency Control)
 - 테이블 스페이스는 동일 데이터에 대한 여러가지 버전 보유
 - 각각의 트랜잭션이 각각의 테이블 스페이스를 가지고 처리(isolation)
 - Roll Pointer은 예전 데이터를 가리킴(Select시에는 이전 데이터를 보게됨)
 - 로그파일용량을 넘어서는 트랜잭션 처리를 위해서 테이블스페이에 기록할 경우도 있음

 

 

InnoDB의 Isolation레벨
 - Read Uncommitted(Dirty Read) : Isolation이 깨진 상태
   쿼리는 진행되거나 커밋된 모든 트랜잭션의 결과를 볼수 있음
   읽기는 락을 걸지 않으며 쓰기에 경우에만 row에 락을 설정
   최고의 성능


 - Read Committed
   읽기 쿼리는 그 커밋된 트랜잭션의 결과만을 볼 수 있음


 - Repeatable Read
   InnoDB의 표준
   새로 시작된 트랜잭션은 그 트랜잭션이 시작되기 전에 커밋된 트랜잭션의 결과만을 보게됨
   트랜잭션안에 포함된 모든 읽기 쿼리는 동일함
   팬텀리드의 문제가 있을 수 있음


 - Serializable
   모든 읽기 쿼리도 해당 row에 락을 설정
   실제하지 않는 유령값이 존재할 수 없음
   Tow phase commit - 커밋이 수행될 것임을 확인할 수 없음

 

 

댓글 없음:

댓글 쓰기