[데이터베이스] 트랜잭션과 동시성 제어(ACID특성, 트랜잭션 처리)

728x90
반응형

트랜잭션과 동시성 제어

트랜잭션이란, 간단히 말하면 한 덩어리의 쿼리 처리 단위를 말한다. 

 


트랜잭션의 4가지 특성_ ACID 특성

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

1) 원자성 (Atomicity)

    : 데이터의 변경을 수반하는 일련의 데이터 조작이 전부 성공할지 전부 실패할지를 보증하는 구조

- All or Nothing

- 원자성도중에 오류가 발생하는 경우, ‘ROLLBACK’ 진행

 

2) 일관성 (Consistency)

 데이터베이스에는 데이터베이스 오브젝트에 대해 각종 정합성 제약을 추가할 수 있다.

이는 일련의 데이터 조작 전후에 그 상태를 유지하는 것을 보증하는, 즉 ‘일관성’을 유지하기 위한 구조이다.

 

ex) 시스템에 사용자를 등록할 때 사용자를 임의로 식별하기 위해 일련번호(사용자 번호)를 사용자에게 발급한다. 이 번호에 유니크 제약을 설정하면 중복된 사용자 번호를 저장할 수 없다.

 

3) 고립성 (Isolation)

: 일련의 데이터 조작을 복수 사용자가 동시에 실행해도 ‘각각의 처리가 모순 없이 실행되는 것을 보증한다’는 것.

 

ex) 부산의 지정 호텔에 남은 싱글룸 수가 10개였을 때 실제로 숙박한 흐름을 프로그래밍하듯이 표현하면같은 방을 동시에 확보하지 못하도록, 데이터베이스 오브젝트인 테이블에 대해 ‘잠금’을 걸어서 후속 처리를 블록하는 방법이 있다.

 

(1) 현재 빈 싱글룸의 수 확인(SELECT) → (2) 빈 싱글룸 수에서 1을 빼고 결과를 빈 싱글룸 수로 되돌려 쓴다(UPDATE)

 

같은 방을 동시에 확보하지 못하도록, 데이터베이스 오브젝트인 테이블에 대해 ‘잠금’을 걸어서 후속 처리를 블록하는 방법이 있다.

 

[ANSI가 정의하는 격리 수준]

  • 커밋되지 않은 읽기
  • 커밋된 읽기
  • 반복 읽기
  • 직렬화 가능

 

4) 지속성 (Durability)

    : 일련의 데이터 조작(트랜잭션 조작)을 완료(commit)하고 완료 통지를 사용자가 받는 시점에서 그 조작이 영구적이 되어 그 결과를 잃지 않는 것

  • 시스템이 정상일 때만이 아니라 데이터베이스나 OS의 이상 종료, 즉 시스템 장애에도 견딜 수 있다.
  • 로그를 남기고 시스템에 이상이 발견하면 그 로그를 사용해 이전 상태로 복원

 


 

잠금 타임아웃과 교착상태

 

* 잠금 타임아웃

갱신과 갱신이 부딪치는 경우 나중에 온 갱신이 잠금 대기 상태가 된다. 잠금 대기로 타임아웃이 발생하는 경우 DBMS로부터 롤백되는 단위가 다를 때가 있는데, 해당 트랜잭션 전체를 롤백하는 경우와 쿼리만 롤백하는 것이다.

 

▶ 트랜잭션 전체를 롤백하고 싶다면?

  • 타임아웃 오류 후 명시적으로 ROLLBACK 실행
  • innodb_rollback_on_timeout 시스템 변수 설정

 

* 교착상태

두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태

 


 

해서는 안 되는 트랜잭션 처리

 

주의1) 오토커밋

: 쿼리 단위로 커밋하는 설정.

간단한 쿼리의 실행과 테스트를 하는 경우에는 편리하지만, 애플리케이션의 잠금을 실행하는 데는 커밋의 부하가 너무 높다.

일정 수 이상의 갱신을 수행하는 처리나 트랜잭션의 기능 등은 적절한 단위와 트랜잭션 격리 수준에서 트랜잭션을 이용해 오토커밋을 사용하지 않도록 하자.

 

주의2) 긴 트랜잭션

긴 트랜잭션은 데이터베이스 트랜잭션의 동시성이나 자원의 유효성을 저하한다.

  • 대량 처리를 한 개의 트랜잭션이 실행한다.
  • 아무것도 하지 않는 트랜잭션을 유의한다.
  • 트랜잭션 중에 대화 처리를 넣는다.
  • 처리 능력 이상의 트랜잭션 수

[참고자료]

데이터베이스 첫걸음(미크, 기무라 메이지)

 

728x90
반응형