트랜잭션이란 무엇인가?
- 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 - 커밋이 수행될 것임을 확인할 수 없음
댓글 없음:
댓글 쓰기