home
트랜잭션
- 요즘에는 여러 사용자가 데이터베이스를 사용한다.
잠금(락)
- 데이터베이스 서버가 데이터 자원의 동시 사용을 제어하는 데 사용하는 메커니즘
- 쓰기잠금, 읽기잠금
- 버전관리: writer는 잠금, reader는 락이 없으나 쿼리 시작부터 끝날 때까지 일관된 보기를 제공
- 장단점이 있는데 첫번째는 대기 시간 길어짐, 두번째는 데이터를 수정 동안 오래 실행되는 쿼리가 있으면 문제
- 잠금단위: 테이블 락, 페이지 락(2kb, 16kb 범위의 메모리 세그먼트), 행 락
트랜잭션
- 여러 SQL 문을 함께 그룹화해서 모든 구문이 성공하거나 성공하지 않도록 하는 장치
- DB서버는 트랜잭션 중간에 서버가 종료됐다가 다시 온라인이 되면 불안전한 트랜잭션을 찾아 롤백시킨다.
- 또한 트랜잭션 후 commit을 했지만 스토리지에 적용이 되기 전에 서버가 종료되면, 다시 서버가 시작될 때 트랜잭션의 변경 사항을 적용해야 한다ㅣ(지속성)
트랜잭션 시작
- 하나는 항상 세션이 연결되어 있어서 트랜잭션 하나 끝나면 자동으로 다른 트랜잭션 시작 -> 시작 필요 X
- 트랜잭션을 시작하지 않으면 개별 SQL 문은 독립적으로 자동 커밋 -> 시작 명령어 실행해야함
- 그런데 자동 커밋은 좋지 않다. 꺼라
트랜잭션 종료
- commit을 사용하면 저장하고 트랜잭션 해제
- 되돌리려면 rollback 사용
- 그 이외의 상황
- 서버가 종료되고 재시작되면 이전 트랜잭션이 커밋
- alter table과 같은 SQL 스키마 문을 실행하면 현재 트랜잭션이 커밋, 새로운 트랜잭션 시작
- 다른 start transaction 명령어가 실행되면 이전 트랜잭션 커밋
- 교착상태 감지시 해당 트랜잭션이 문제라고 판단되면 서버는 트랜잭션을 조기 종료
ㅈㅈ
트랜잭션 세이브 포인트
- 전체 롤백 말고 특정 작업까지 save 할 수 있다.
SAVEPOINT my_savepoint;
로 생성 가능ROLLBACK TO SAVEPOINT my_savepoint;
로 롤백 가능
스토리지 엔진 선택
- 리소스 잠금과 트랜잭션 관리를 포함한 낮은 수준의 데이터베이스 기능을 제공하기 위해 여러 스토리지 엔진 제공
- MyISAM: 테이블 잠금을 사용하는 넌트랜잭션 엔진
- MEMORY: 인메모리 테이블에 사용되는 넌트랜잭션 엔진
- CSV: 데이터의 쉼표로 구분해서 파일에 저장하는 트랜잭션 엔진
- InnoDB: 행 수준 잠금을 사용하는 트랜잭션 엔진
- Merge: 여러 개의 MyISAM 테이블을 단일 테이블로 표시하는 특수 엔진
- Archive: 주로 보관 목적으로 대량의 인덱싱되지 않은 데이터를 저장하는 특수 엔진
- Mysql은 테이블별로 스토리지 엔진을 선택할 수 있다.
- 그러나 트랜잭션을 사용하는 테이블의 경우 행 수준 잠금 및 버전 관리를 제공하는
InnoDB
엔진을 선택해야함