[SQL] SQL Booster - OLTP SQL 기술
2024, May 07
목차
8.1 트랜잭션
8.1.1 트랜잭션이란?
: 한 번에 처리되어야 하는 논리적인 작업 단위
- 명령어 : COMMIT, ROLLBACK
- COMMIT : 모두 반영하고 종료
- ROLLBACK : 모두 취소하고 종료
트랜잭션의 시작과 끝
- 데이터 변경 SQL이 실행되는 순간 시작
- COMMIT이나 ROLLBACK을 만나기 전까지 유지
- 트랜잭션 내에 에러가 발생했다고 해서 자동으로 ROLLBACK이 수행되지 않는다.
8.1.3 트랜잭션 고립화 수준 - READ COMMITTED
: 하나의 트랜잭션에서 작업 중인 데이터가 다른 트랜잭션의 영향을 받지 않는 정도 (어느정도까지 접근할 수 있는 지에 대한 정도)
- 고립화 수준을 낮게 설정하면, 동시성이 좋아진다.
고립화 수준 종류
https://itwiki.kr/w/트랜잭션_고립화_수준
- READ UNCOMMITTED
- READ COMMITTED
- REPEATABLE READ
- SERIALIZABLE READ
대기 상태
: 선행 트랜잭션이 데이터를 변경하고 있음으로, 후행 트랜잭션이 데이터에 접근하지 못하고 기다리는 상태
READ-COMMITTED의 특징
- 한 트랜잭션에서 변경중이면, 다른 트랜잭션에서는 변경 전 데이터만 조회할 수 있음
- 한 트랜잭션에서 변경중인 데이터는, 다른 트랜잭션에서 동시에 변경할 수 없음
- 늦게 UPDATE를 시도한 세션은 대기 상태에 빠짐
- 같은 키 값을 가진 데이터가 동시에 입력되면, 후행 트랜잭션은 대기 상태에 빠짐
8.2 락(LOCK)
8.2.1 락(LOCK)
- 데이터 변경 시 락 발생 - 트랜잭션이 COMMIT 또는 ROLLBACK 할 때까지 유지
- 대기 상태를 만드는 것이 LOCK이다.
8.2.2 SELECT~FOR UPDATE
- READ COMMITTED - 변경된 데이터에 로우 단위로 변경 락을 생성
- 데이터의 일관성을 확보하려면 ‘SELECT ~ FOR UPDATE’를 활용해야 함 - 데이터 조회 시점부터 변경 락을 생성함
- 단점 : 동시성을 떨어트림 → SQL과 트랜잭션 최적화가 필요함
- ‘NO WAIT’ 와 ‘WAIT SECONDS’ 옵션 지정 가능
- NO WAIT - 대기 상태에 빠지자마자 예외 발생
- WAIT SECONDS - 대기할 초 설정 가능
8.2.3 대기(WAIT) 상태
- 폴링 처리 : 특정 수만큼의 세션을 DB와 연결해놓고 사용자끼리 공유하는 것
- 세션이 대기 상태에 빠지는 원인 : 느린 SQL, 종료되지 않은 트랜잭션
8.2.4 데드락(DEAD-LOCK, 교착상태)
- 세션끼리 서로 기다리고 있는 상태(작업을 더 진행할 수 없는 상태)