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;
'MYSQL강좌정리' 카테고리의 다른 글
20차 대용량 데이터베이스 구축기술 (0) | 2022.11.30 |
---|---|
19장 Stored Procedure, Trigger (0) | 2022.11.30 |
FULL TEXT SEARCH(전문검색), BULK INSERT (0) | 2022.11.30 |
16장 파티셔닝/샤딩, 데이터베이스 복제 (0) | 2022.11.29 |
15장 데이터백업 복원 로그 (0) | 2022.11.29 |