트랜잭션 (Transaction)
트랜잭션이란 데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위를 뜻한다.
- 작업의 완전성 보장
- 사용자의 작업셋을 모두 완벽하게 처리(커밋)하거나 처리하지 못하면 원상태로 복구(롤백)
MySQL 스토리지 엔진
SQL 엔진 vs 스토리지 엔진
- MyISAM
- InnoDB
- memory
InnoDB
요즘은 다 InnoDB를 사용하는 추세이다.
- 트랜잭션 지원
- FK → 관계형 데이터 베이스 사용 가능
- 버퍼링 : 작업을 Buffer pool에 쌓아두었다가 한번에 처리
Database Lock
Lock 단어 그대로 "잠금"의 의미를 갖는다.
하나의 데이터를 동시에 여러 명이 조작할 수 없도록 잠그는 것으로, 동시성(concurrency)를 보장한다.
MySQL 엔진락과 InnoDB락이 있다.
MySQL 엔진 락
- 글로벌 락 : 전반적인 모든 조작을 멈춤
- 테이블 락
- 하나의 테이블을 대상으로 조작을 멈춤
- Read Lock : 데이터를 읽으려고 하니까 입력하지 못하도록 락을 걸음 → INSERT 안됨
- Write Lock : 데이터를 쓰려고 하니까 읽지못하도록 락을 걸음 → SELECT 불가
- 네임드 락 : 임의로 시간동안 조작 권한을 갖는 락을 획득
- 메타데이터 락
InnoDB의 락 종류
- 레코드 락 : 테이블의 row을 대상으로 락을 걸음
- Auto Increment :
데드락?
데르락이란 락이 죽은 것을 의미한다.
릴리즈가 잘 처리되지 않아 이미 연결이 끊겼음에도 락이 유지되고 있는 듯이 제한이 풀리지 않는다고 생각하면 된다.
락이 죽으면 데이터에 접근하기 위해 락이 릴리즈 될 때까지 하염없이 기다리기 때문에 데이터베이스 성능 저하 문제가 발생한다.
격리 수준 (Isolation Level)
- Read Uncommitted : 커밋되지 않을 것을 읽을 수 있다.
- Read Committed : 커밋된 것을 읽을 수 있다.
- Repeatable Read (default) : 계속 읽을 수 있다.
- Serializable : 트랜잭션간 완전히 격리한다.
Read Uncommitted
📌 터미널1
-- 1. 오토커밋 해제 및 격리수준 변경
set @@autocommit=0;
SELECT @@autocommit;
set SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT @@transaction_isolation;
-- 4. 트랜잭션 시작하고 데이터 삽입
start transaction;
INSERT into test_table (id) values (123);
-- 6. 데이터 조회 (삽입한 데이터 보임)
SELECT * FROM test_table;
-- 7. 커밋 안하고 되돌리기로 마무리
rollback;
📌 터미널2
-- 2. 격리수준 변경
set SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT @@transaction_isolation;
-- 3. 데이터 조회 (터미널1에서 트랜잭션 시작 전)
SELECT * FROM test_table;
-- 5. 데이터 조회 (터미널1에서 삽입한 커밋전의 데이터가 보임)
SELECT * FROM test_table;
'💻 Computer Science > 데이터베이스' 카테고리의 다른 글
[H2] H2 데이터베이스 사용하기 (1) | 2022.06.02 |
---|---|
[MariaDB] 마리아디비 사용하기 (0) | 2022.03.24 |
SQL 총 정리 (2) | 2022.02.10 |