Transaction/Lock/Isolation
* Transaction
: 복수 SQL문을 수행하는 도중 장애가 발생했을때 장애에 대응할 수 있도록 하는 기능
: 전체 수행(Commit)과 전체 취소(Rollback) 두가지 결과값만 가져야함
: 기본적으로 SQL 수행모드는 AutoCommit모드(줄단위 커밋모드)
: 트랜잭션을 지원하기위해서는 AutoCommit모드를 오프시켜야함.
: InnoDB 스토리지엔진만 가능하다.
autocommit 확인
: SELECT @@autocommit (1=true/0=false)
autocommit 지정
: set autocommit = false;
트랜잭션 설정(DB설정이후 해야함.)
: commit or rollback
ACID 특성
: 원자성
: ALL or Nothing, Commit/Rollback
: 일관성
: 트랜잭션 전후에 데이터가 손상을 받으면 안됨
: 같은 데이터가 다른 값을 가지면 안됨
: 고립성/격리수준
: 여러개의 트랜잭션이 수행될 때 성능과 데이터 안전성간의 트레이드오프
: 지속성
: 트랜젝션이 종료된 이후 데이터에 문제가 없어야한다.
락(Lock)
: 공유자원에 대해 여러개의 트랜잭션이 접근하려고 경쟁하려고 할때 제어하는 방법
: 동시성제어(Concurrency Control)이라고 하고 보통 lock 으로 해결
: 프로그래밍에서 동기화라고도 함.
: 일관성과 무결성을 지키기위해 적용
- 테이블단위락 ( Table Lock ) : MyISAM
: 동일한 테이블을 다른 트랜잭션이 사용하고 있다면 접근 금지
- 줄단위 락( Row Lock ) : InnoDB
: 동일한 줄(Row)만 접근 금지(테이블락에 비해 높은 성능)
: 스토리지 엔진은 기본/DB/테이블 단위로 변경할 수 있다.
* 격리(Isolation
: 트랜잭션의 격리수준
: 트랜잭션에 일관성 없는 데이터를 허용하는 레벨(안정성과 성능이 반비례되어 정렬)
: Read Uncommitted : 거이 안씀
: Commit되지 않는 처리중인 데이터를 읽기 허용한다.
: 성능은 높지만 데이터 안정성이 떨어짐
: Read Committed : 많이 사용
: 트랜잭션이 끝난 이후에만 접근하도록 허용(Committed data)
: Repeatable Read : 많이 사용
: 다른 트랜잭션이 UPDATE를 하는 것을 금지하지만, 레코드를 INSERT것은 허용
: Serializable
: 트랜잭션이 동시에 수행되는것이 금지되고 순차적 실행
: 성능저하가 있음.
: 격리수준 확인
: SELECT @@tx_isolation
: SET tx_isolation = 'READ-COMMITED'
: COMMIT