[SQL] SQL Booster - OLTP SQL 기술



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, 교착상태)

  • 세션끼리 서로 기다리고 있는 상태(작업을 더 진행할 수 없는 상태)

다른 글