본문 바로가기
🖥Web/🔥DB & SQL

[DB & SQL] SQL 고급활용 및 튜닝 / Lock과 트랜잭션 동시성 제어

by 후눅스 2022. 5. 23.
반응형

SQL 고급활용 및 튜닝 / Lock과 트랜잭션 동시성 제어

 

Lock에 의한 성능 저하를 최소화하는 방안

  1. 트랜잭션의 원자성을 훼손하지 않는 선에서 트랜잭션을 가능한 짧게 정의할 것
  2. 같은 데이터를 갱신하는 트랜잭션이 동시에 수행되지 않도록 설계할 것
  3. 주간에 대용량 갱신 작업이 불가피하다면, 블로킹 현상에 의해 사용자가 무한정 기다리지 않도록 적절한 프로그래밍 기법을 도입할 것
  4. 트랜잭션 격리성 수준을 불필요하게 상향 조정하지 않을 것
  5. 트랜잭션을 잘 설계하고 대기 현상을 피하는 프로그래밍 기법을 적용하기에 앞서, SQL 문장이 가장 빠른 시간 내에 처리를 완료할 것

 

블로킹(Blocking)

블로킹(Blocking)은 Lock 경합이 발생해 특정 세션이 작업을 진행하지 못하고 멈춰 선 상태를 말한다. 공유 Lock끼리는 호환되기 때문에 블로킹이 발생하지 않는다. 공유 Lock과 배타적 Lock은 호환되지 않아 블로킹이 발생할 수 있다.

 

SQL Server의 공유 Lock은 트랜잭션이나 쿼리 수행이 완료될 때까지 유지되는 것이 아니라 다음 레코드가 읽히면 곧바로 해제된다. 단, 기본 트랜잭션 격리성 수준(Read Committed)에서만 그렇다. 격리성 수준을 변경하지 않고도 트랜잭션 내에서 공유 Lock이 유지되도록 하려면 테이블 힌트로 holdlock을 지정하면 된다. 또한, 두 트랜잭션은 상대편 트랜잭션에 의한 공유 Lock이 해제되기만을 기다리는 교착상태를 방지하려고 SQL Server는 갱신(Update) Lock을 두게 되었고, 이 기능을 사용하려면 updlock힌트를 지정하면 된다.

 

테이블 Lock 종류로는 아래 5가지가 있다.

  • Row Share(RS)
  • Row Exclusive(RX)
  • Share(S)
  • Share Row Exclusive(SRX)
  • Exclusive(X)

 

낮은 단계의 격리성 수준에서 발생할 수 있는 현상들

  1. Dirty Read
    • 다른 트랜잭션에 의해 수정됐지만 아직 커밋되지 않은 데이터를 읽는 것을 말한다.
  2. Non-Repeatable Read
    • 한 트랜잭션 내에서 같은 쿼리를 두 번 수행했는데, 그 사이에 다른 트랜잭션이 값을 수정 또는 삭제하는 바람에 두 쿼리 결과가 다르게 나타나는 현상을 말한다.
  3. Phantom Read
    • 한 트랜잭션 내에서 같은 쿼리를 두 번 수행했는데, 첫 번째 쿼리에서 없던 유령(Phantom) 레코드가 두 번째 쿼리에서 나타나는 현상을 말한다.

 

트랜잭션 격리성 수준

  • Read Uncommitted
    • 트랜잭션에서 처리중인 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용한다.
  • Read Committed
    • 트랜잭션이 커밋되어 확정된 데이터만 다른 트랜잭션이 읽도록 허용함으로써 Dirty Read를 방지해준다.
  • Repeatable Read
    • 트랜잭션 내에서 쿼리를 두 번 이상 수행할 때, 첫 번째 쿼리에 있던 레코드가 사라지거나 값이 바뀌는 현상을 방지해준다.
  • Serializable Read
    • 트랜잭션 내에서 쿼리를 두 번 이상 수행할 때, 첫 번째 쿼리에 있던 레코드가 사라지거나 값이 바뀌지 않음은 물론 새로운 레코드가 나타나지도 않는다.

 

다중버전 동시성 제어(Multiversion Concurrency Control, 이하 MVCC)

  • 데이터를 변경할 때마다 그 변경사항을 Undo 영역에 저장해둔다.
  • 데이터를 읽다가 쿼리(또는 트랜잭션) 시작 시점 이후에 변경된(변경이 진행 중이거나 이미 커밋된) 값을 발견하면, Undo 영역에 저장된 정보를 이용해 쿼리(또는 트랜잭션) 시작 시점의 일관성 있는 버전(CR Copy)을 생성하고 그것을 읽는다.

 

DBMS의 읽기 일관성 메커니즘

  • 읽기 일관성을 위해 Undo 세그먼트(또는 버전 저장소)에 저장된 Undo(또는 Shapshot) 데이터를 활용한다.
  • MVCC 모델은 기본적으로 완벽한 문장 수준 읽기 일관성을 보장한다.
  • MVCC 모델은 트랜잭션 수준의 읽기 일관성을 보장하지는 않는다.
  • 트랜잭션 수준 읽기 일관성이란, 트랜잭션이 시작된 시점을 기준으로 일관성 있게 데이터를 읽어드리는 것을 말한다.

 

비관적 동시성 제어(Pessimistic Concurrency Control)

  • 두 트랜잭션이 같은 데이터를 동시에 수정할 것이라고 가정하고 데이터를 읽는시점에 Lock을 설정하는 방식을 말한다.

 

낙관적 동시성 제어(Optimistic Concurrency Control)

  • 두 트랜잭션이 같은 데이터를 동시에 수정하지 않을 것이라고 가정하고 데이터를 읽는 시점에 Lock을 설정하지 않는 방식을 말한다. 이 방식에선 데이터를 수정하는 시점에, 앞서 읽은 데이터가 다른 트랜잭션에 의해 변경되었는지 반드시 확인해야 데이터 정합성을 유지할 수 있다.

 

트랜잭션 격리성 수준(Transaction Isolation Level)

  • 상향 조정할수록 일관성은 높아지지만 동시성은 낮아진다.
  • Serializable로 상향조정하면 프로그램에서 별도의 동시성 제어를 하지 않아도 DBMS가 트랜잭션 단위 일관성을 보장해준다.

 

트랜잭션의 특징

  • 원자성
    • 더 이상 분해가 불가능한 업무의 최소단위를 말한다.
  • 일관성
    • 트랜잭션이 그 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 변환한다. 즉, 트랜잭션 실행의 결과로 데이터베이스 상태가 모순되지 않는다.
  • 격리성
    • 트랜잭션이 실행 중에 생성하는 연산의 중간 결과는 다른 트랜잭션이 접근할 수 없다.
  • 영속성
    • 트랜잭션이 일단 그 실행을 성공적으로 완료하면 그 결과는 데이터베이스에 영속적으로 저장된다.

 

 

 

 

 

 

 

 

 

 

참조:

SQL자격검정실전문제

 

 

반응형