솜이의 데브로그

7장 ) 트랜잭션과 동시성 제어 본문

CS/Database

7장 ) 트랜잭션과 동시성 제어

somsoming 2021. 11. 14. 15:39

Reference : 데이터베이스 첫걸음

 

 

10강 ) 트랜잭션을 다룰 수 있는 테이블

 

데이터베이스에서 한 덩어리의 쿼리 처리 단위를 '트랜잭션' 이라고 한다.

데이터베이스에서는 복수의 쿼리를 연속적으로 사용해 일관성 있는 한 단위로 취급한다.

 

트랜잭션은 4가지 특성으로 정의되며 ACID 특성이라고 한다.

  1. Atomicity (원자성)
  2. Consistency (일관성)
  3. Isolation (고립성 또는 격리성)
  4. Durability (지속성)

 

원자성

  • 데이터의 변경을 수반하는 일련의 데이터 조작이 전부 성공할지 전부 실패할지를 보증하는 구조.
  • 데이터 처리 도중 오류가 발생하는 경우, ROLLBACK을 실행한다.

 

일관성

  • 일련의 데이터 조작 전후에 그 상태를 유지한다.
  • 사용자를 임의로 식별하기 위해 일련번호를 사용자에게 발급, 번호에 유니크 제약을 설정해 중복된 사용자 번호를 저장할 수 없도록 한다.

 

고립성

  • 일련의 데이터 조작을 복수 사용자가 동시에 실행해도 '각각의 처리가 모순 없이 실행되는 것을 보증'.
  • 데이터베이스 오브젝트인 테이블에 대해 '잠금'을 걸어서 후속 처리를 블록한다. 잠금 단위에는 테이블 전체, 블록, 행 등이 있으며, MySQL에서는 트랜잭션 처리를 할 때 주로 행 단위의 잠금 기능을 이용한다.
  • 직렬화 가능 이외에 자신이 아닌 다른 트랜잭션의 영향 받는 것을 허용하는 4개의 단계
    • 커밋되지 않은 읽기
    • 커밋된 읽기
    • 반복 읽기
    • 직렬화 가능

 

지속성

  • 일련의 데이터 조작을 완료하고 완료 통지를 사용자가 받는 시점에서 그 조작이 영구적이 되어 그 결과를 잃지 않는 것.
  • 시스템이 정상일 때만이 아니라 데이터베이스나 OS 이상 종료, 시스템 장애도 견딜 수 있다는 뜻을 의미한다.

 

 

다른 커넥션에서 테이블 볼 때

  • DDL에 따른 암묵적인 커밋
    • MySQL이나 Oracle에서는 CREATE TABLE과 같은 DDL 실행 시 암묵적인 커밋이 발생한다.
  • 오토커밋 설정
    • 트랜잭션의 개시가 명시적으로 지정되지 않았을 때 트랜잭션을 구별하는 방법
      • 하나의 SQL문이 하나의 트랜잭션으로 구분
      • 사용자가 COMMIT 또는 ROLLBACK을 실행하기까지가 하나의 트랜잭션이 된다.

 

 

  • DDL : Data Definition Language, 스키마 또는 테이블을 작성하거나 제거
  • DML : Data Manipulation Language, 테이블의 행을 검색하거나 변경하는데 사용
  • DCL : Data Control Language, 데이터베이스에서 실행한 변경을 확정하거나 취소하는 데 사용

 

 

11강 ) 복수 커넥션에서 읽기와 쓰기

 

MySQL은 MVCC라는 기술을 사용한다. 따라서 다음 특성을 가진다.

  1. 읽기를 수행할 경우 갱신중이라도 블록되지 않는다.
  2. 읽기 내용은 격리 수준에 따라 내용이 바뀌는 경우가 있다.
  3. 갱신 시 배타적 잠금을 얻는다. 잠금은 기본적으로 행 단위로 얻으며 트랜잭션이 종료할 때까지 유지한다. 격리 수준이나 InnoDB의 설정에 따라 실제로 잠금 하는 행의 범위가 다른 경우가 있다.
  4. 갱신과 갱신은 나중에 온 트랜잭션이 잠금을 획득하려고 할 때 블록된다. 일정 시간을 기다리며 그 사이에 잠금을 획득할 수 없는 경우 잠금 타임아웃이 된다.
  5. 갱신하는 경우 갱신 정의 데이터를 undo 로그로 롤백 세그먼트라는 영역에 유지한다.

 

트랜잭션 격리 수준별 외관

  • 반복 읽기
  • 커밋된 읽기
  • 갱신을 수행하는 트랜잭션 자신

 

 

 

12강 ) 잠금 타임아웃과 교착 상태

 

잠금 타임아웃

  • 서로를 블록하지 않지만, 갱신끼리 부딪치는 경우 나중에 온 갱신이 잠금 대기상태가 된다.
  • 잠금해제를 기다리고 있는 쪽에서는 잠금을 기다리는 여부와 시간을 설정할 수 있다.

 

교착 상태

  • 트랜잭션끼리 각 다른 테이블에 잠금을 유지한 채 서로 잠금을 건 자원에 잠금이 필요한 처리(INSERT/ UPDATE/ DELETE) 를 실행한 상황을 말한다.
  • 일반적인 DBMS에서는 교착 상태를 독자적으로 검출해 교착 상태를 보고한다.
  • MySQL도 교착상태가 일어나면 즉시 인식해 시스템에 영향이 작은 쪽의 트랜잭션을 트랜잭션 개시 시점까지 롤백한다.
  • 교착 상태의 발생 빈도를 낮추기 위한 방법
    • 트랜잭션을 자주 커밋한다.
    • 정해진 순서로 테이블에 액세스한다.
    • 필요 없는 경우에는 읽기 잠금 획득의 사용을 피한다.
    • 쿼리에 의한 잠금 범위를 더 좁히거나 잠금 정도를 더 작은 것으로 한다.
    • 한 테이블의 복수 행을 복수의 연결에서 순서 변경 없이 갱신하면 교착 상태가 발생하기 쉽다. 따라서 테이블 단위의 잠금을 획득해 갱신을 직렬화한다. (동시성은 떨어짐)
    • 테이블에 적절한 인덱스를 추가해 쿼리가 이를 이용하게 한다.

 

하지 말아야하는 트랜잭션 종류

  • 오토커밋 : 쿼리 단위로 커밋.
  • 긴 트랜잭션 : 데이터베이스 트랜잭션의 동시성이나 자원의 유효성을 저하.
  • 대량 처리를 한 개의 트랜잭션이 실행
  • 아무것도 하지 않는 트랜잭션 유의
  • 트랜잭션 중 대화처리
  • 처리 능력 이상의 트랜잭션 수

'CS > Database' 카테고리의 다른 글

8장 ) 테이블 설계(1)  (0) 2021.11.28
23,24강 ) 서브쿼리, 상관 서브쿼리  (0) 2021.11.14
20-22강 ) 집계, 그룹화  (0) 2021.11.06
6장 ) SQL문의 기본 : Select(2)  (0) 2021.11.06
16-19강 : 데이터의 추가, 삭제, 갱신  (0) 2021.10.31