-
2주차 Database Study
- 데이터 정합성 : 데이터가 서로 모순이 없이 일관되게 일치해야함 ex) A가 변경되면 B도 똑같이 변경되어야함
- 데이터 무결성 : 데이터의 값이 정확해야함 ex) 제약조건을 위반한 값이 있으면 안된다
트랜잭션
데이터베이스에서 일련의 작업을 하나로 묶어서 처리하는 것
트랜잭션은 일련의 작업에 대한 데이터 정합성을 보장해준다.
작업 수행 도중 실패하게되면 모든 데이터가 이전 상태로 돌아간다 → 데이터 정합성 보장 = 데이터에 모순이 없음
트랜잭션의 특성 : ACID
Atomicity (원자성)
트랜잭션 내 모든 작업이 하나로 처리되어야함
ALL 성공 or ALL 실패
Consistency (일관성)
트랜잭션 시작/종료의 데이터베이스 상태는 일관되어야함
데이터의 규칙이나 제약조건을 위반하면 안된다
Isolation (격리성)
각 트랜잭션은 독립적으로 실행되어야하며 트랜잭션 간 영향을 줄 수 없음
Durability (지속성)
트랜잭션이 완료되면 작업 내용이 정상적으로 반영되어야함
트랜잭션이 완료되고 DB가 다운되더라도 값은 정확해야함
트랜잭션의 기본 연산
- 커밋 : 트랜잭션에서의 작업 내용을 데이터베이스에 영구적으로 저장
- 롤백 : 트랜잭션을 취소하고 트랜잭션 이전 상태로 되돌리는 연산
세이브포인트(Savepoint)
특정 지점에 이름을 붙여 저장할 수 있는 기능 = 게임에서 체크포인트 느낌
롤백 상황이 발생했을 때 전체 롤백이 아닌 세이브포인트까지만 롤백이 가능
BEGIN TRANSACTION UPDATE accounts SET balance = balance - 100 WHERE account_id = 1; SAVEPOINT sp1; //세이브 포인트 지정 UPDATE accounts SET balance = balance + 100; //where문을 까먹음? ROLLBACK TO SAVEPOINT sp1; //세이브 포인트로 롤백
위 상황과 같이 where로 조건을 지정해야하는 것을 까먹어서 원복해야하는 경우
세이브 포인트로 롤백하는 방식으로 사용할 수 있을 것같다.
사용해본적은 없음트랜잭션 격리 수준
여러 트랜잭션이 동시에 실행될 때 하나의 트랜잭션이 다른 트랜잭션의 작업을 볼 수 있는 정도
읽기 미정 (Read Uncommitted)
가장 낮은 격리 수준
더티 리드 발생 가능 : 하나의 트랜잭션이 커밋되지않은 다른 트랜잭션이 변경사항을 읽는 현상
ex)
A 트랜잭션이 1을 2로 변경
B 트랜잭션이 2를 읽고 3으로 변경 → 아직 완료가 안되었어도 읽을 수 있음
만약 A 트랜잭션이 실패하게된다면 값은 3이 된다.
읽기 커밋 (Read Committed)
커밋한 데이터만 읽을 수 있음
반복 불가능한 읽기 발생 가능 : 트랜잭션 수행시 반복 읽기 작업에서 중간에 다른 트랜잭션이 값을 변경하면 읽은 값이 서로 다를 수 있음
ex)
A 트랜잭션이 1을 읽음
B 트랜잭션이 1을 2로 변경 및 커밋
A 트랜잭션이 다시 읽었는데 2 → B 트랜잭션이 값을 변경하고 커밋했기 때문에 같은 트랜잭션이더라도 값이 다름
반복 가능한 읽기 (Repeatable Read)
MySQL 기본 격리 수준
처음 읽은 데이터를 반복해서 읽을 때 항상 동일한 값을 얻을 수 있도록 보장 : 스냅샷으로 생각하면 이해하기 쉬움
팬텀 리드 발생가능 : 새로운 행이 추가되거나 기존행이 삭제될 때 값이 달라질 수 있음
ex)
A 트랜잭션이 COUNT 쿼리 → 결과 1
B 트랜잭션이 INSERT
A 트랜잭션이 다시 COUNT 쿼리 → 결과 2 : 새로운 행이 하나 추가되었으므로 동일한 트랜잭션이더라도 값이 달라짐
직렬화 (Serializable)
가장 높은 격리 수준
하나의 트랜잭션이 완료되기전까지 다른 트랜잭션은 대기
트랜잭션 격리 수준이 높을 수록 안정성은 보장되지만 성능은 낮아진다