트랜잭션과 잠금
Last updated
Last updated
작업의 완전성을 보장해주는 것을 말한다. 논리적인 작업 셋을 모두 처리하거나, 처리하지 못할 경우에는 복구해서 일부만 적용되지 않도록 해주는 기능이다.
트랜잭션은 개발자가 고민해야 되는 데이터 동시성 문제를 해결해주지만, 범위를 작게 유지해 주는편이 좋다
Mysql이 제공하는 잠금중 가장 큰 범위의 잠금이다. 한 세션이 글로벌 락을 획득 하면 다른 세션에서는 Select를 제외한 모든 요청은 대기상태로 남는다. 글로벌 락이 미치는 범위는 Mysql 서버 전체이며, 테이블&데이터 베이스가 달라도 동일한 영향을 미친다.
FLUSH WITH READ LOCK
을 이용한 글로벌 명령은 서버의 모든 변경 작업을 멈춘다.
개별 테이블 단위로 설정되는 잠금이며, 명시&묵시적으로 특정 테이블의 락을 획득할 수 있다.
명시적으로 획득한 잠금은 UNLAOCK TABLES
로 반납할 수 있다.
묵시적으로 테이블락을 획득하는 경우는 테이블 데이터를 변경하는 쿼리를 실행하면 발생한다.
데이터가 변경되는 테이블에 잠금을 설정하고 변경한 후, 즉시 잠금을 해제하는 형태로 사용한다.
임의의 문자열에 대해 잠금을 설정할 수 있다. 사용자가 지정한 문자열에 대해 획득&반납하는 잠금이다.
데이터베이스 객체의 이름이나 구조를 변경하는 경우에 획득한다. 테이블의 이름을 변경하는 경우 획득하는 잠금이다.
RECORD 기반의 잠금 방식을 택하고 있다. 뛰어난 동시성 처리를 제공할 수 있으며, 이원화된 잠금 처리가 있어 스토리지 엔진 잠금 정보는 접근하기 까다로웠지만, 트랜잭션 목록을 조회할 수 있는 방법이 도입되었다.
레코드 기반의 잠금 기능을 제공하며, INNODB_TRX, INNODB_LOCKS, INNODB_LOCK_WAITS
로 확인할 수 있다.
레코드 락
: 레코드 자체만을 잠그는 것을 말한다
갭 락
: 하나의 작업 크기 [ 그룹 ] 을 잠군다
넥스트 키 락
: 작업 크기와 레코드를 같이 잠구는것을 말한다
자동 증가 락
: 체번 값이 중복되지 않도록 잠군다
Innodb의 잠금은 레코드를 잠그는 것이 아니라 인덱스를 잠궈 처리된다. 변경 해야할 레코드를 찾기 위해 검색한 인덱스의 레코드가 전부 락이 걸리게 된다.
트랜잭션이 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 말지 결정하는 것이다.
READ UNCOMMITTED
: COMMIT, ROLLBACK에 상관없이 다른 트랜잭션에서 조회가 가능하다
dirty read라고도 부르며 정합성에 문제가 있어 자주 사용되지 않는다
READ COMMITTED
: 대부분 서비스에서 가장 많이 사용한다. COMMIT된 데이터만 조회할 수 있다
시점의 차이로 REPEATEAABLE READ시 정합성이 안맞을 수 있다
REPEATABLE READ
: INNODB 기본 설정값이다.
반복 조회시 생긴 정합성 문제가 해결되며 UNDO공간에 백업을 예상하고 레코드값을 변경한다.