트랜잭션
- 데이터베이스의 상태를 변경시키기 위해 수행하는 작업 단위
- 하나의 거래를 안전하게 처리하도록 보장
- 하나의 거래가 처리되는 과정에서 하나라도 실패가 일어날 시 거래 이전의 상태로 되돌아가도록 한다
Commit
: 모든 작업이 성공해서 데이터베이스에 정상 반영하는 것Rollback
: 작업 중 하나라도 실패해서 거래 이전으로 되돌리는 것
트랜잭션 ACID
- 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업처럼 모두 성공하거나 모두 실패해야 한다
- 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다
- 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야 한다
- 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 한다
- 동시성과 관련된 성능 이슈로 인해 Isolation level을 선택할 수 있다
- 트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야 한다
1. 원자성 (Atomicity)
2. 일관성 (Consistency)
3. 격리성 (Isolation)
4. 지속성 (Durability)
트랜잭션 격리 수준(Isolation level)
- 격리성 완벽 보장을 위해선 트랜잭션을 순차적으로 실행해야 하는데, 이는 동시 처리 성능을 매우 악화시킨다. 따라서 ANSI 표준은 트랜잭션 격리 수준을 4단계로 정의하였다
- READ UNCOMMITED (커밋되지 않은 읽기)
- READ COMMITED (커밋된 읽기)
- REPEATABLE READ (반복 가능한 읽기)
- SERIALIZABLE (직렬화 가능)
COMMIT
- 자동 커밋 : default. 각각의 쿼리 실행 직후 자동으로 커밋 호출
- 수동 커밋 :
COMMIT
,ROLLBACK
을 직접 호출하며 트랜잭션 수행- 보통 자동커밋 모드에서 수동커밋 모드로 전환하는 것을 트랜잭션을 시작한다고 표현
set autocommit false;
- 보통 자동커밋 모드에서 수동커밋 모드로 전환하는 것을 트랜잭션을 시작한다고 표현
DB LOCK
- 한 세션이 트랜잭션을 시작하고 데이터를 수정하는 동안에는 커밋이나 롤백 전까지 다른 세션에서 해당 데이터를 수정할 수 없게 막아 트랜잭션의 원자성을 지킴
sessionA
와sessionB
가 동시에dataA
에 대한 update를 수행하려고 하면, 조금 더 먼저 요청한sessionA
가 해당 로우에 대한 락을 획득한다sessionA
가 해당 로우에 대한 update sql을 수행하는 동안sessionB
는 락이 돌아올 때까지 대기한다- 이 때, 데이터베이스에 설정된 락 대기 시간만큼 대기하고 지나면 락 타임아웃 오류가 발생한다
SET LOCK_TIMEOUT 60000;
- 이 때, 데이터베이스에 설정된 락 대기 시간만큼 대기하고 지나면 락 타임아웃 오류가 발생한다
sessionA
의 SQL이 수행되고 트랜잭션이 종료되면sessionB
가 락을 획득한다sessionB
의 SQL이 수행되고 커밋 후 트랜잭션이 종료되면 락을 반납한다
SELECT FOR UPDATE
- 일반적인 조회는 락을 사용하지 않지만 트랜잭션 종료 시점까지 해당 데이터를 다른 세션에서 변경하지 못하도록 강제로 막아야 할 때 사용
- ex) 일일 마감 결산 시
select * from member where member_id='memberA' for update;
- ex) 일일 마감 결산 시