logo
Published on

Transaction에 대하여

Authors
  • Name
    Twitter

트랜잭션(Transaction)이란?

데이터베이스에서 트랜잭션은 작업의 완전성을 보장해주는 것이다. 즉, 논리적인 작업을 모두 완벽하게 처리하지 못할 경우 원 상태로 복구해서 작업의 일부만 적용되는 일을 방지하는 기능이다.

트랜잭션과 Lock

잠금(Lock)은 여러 커넥션에서 동시에 동일한 자원을 요청할 경우 순서대로 한 시점에 하나의 커넥션만 변경할 수 있게 해주는 역할을 한다.

트랜잭션은 논리적인 작업 셋 중 한 개든 두 개 이상이든 모든 작업이 제대로 끝나지 않는다면 아무것도 적용되지 않게 보장해준다.

트랜잭션의 특성

트랜잭션은 ACID라는 4가지 특성을 만족해야한다.

원자성(Atomicity)

트랜잭션 중간에 어떠한 문제가 발생했을 때 트랜잭션에 해당하는 어떠한 작업 내용도 수행되어서는 안되며 아무런 문제가 발생되지 않았을 경우에만 모든 작업이 수행되어야 한다.

일관성(Consistency)

트랜잭션이 완료된 다음의 상태에서도 트랜잭션이 일어나기 전의 상황과 동일하게 데이터의 일관성을 보장해야 한다.

고립성(Isolation)

각각의 트랜잭션은 서로 간섭업이 독립적으로 수행되어야 한다.

지속성(Durability)

트랜잭션이 정상적으로 종료된 다음에는 영구적으로 데이터베이스에 작업의 결과가 저장되어야 한다.

트랜잭션을 사용할 때 주의할 점

트랜잭션은 꼭 필요한 최소의 코드에만 적용하는 것이 좋다. 일반적으로 데이터베이스에서 커넥션의 개수는 제한적이기 때문인데, 각각의 프로그램이 커넥션을 소유하는 시간이 길어진다면 사용 가능한 여유 커넥션의 수가 줄어들게 되어 커넥션을 가져가기 위해 기다리는 상황이 발생할 수 있기 때문이다.

교착상태

복수의 트랜잭션을 사용할 때 교착상태가 일어날 수 있다. 교착상태란 두 개 이상의 트랜잭션이 특정 자원의 잠금(Lock)을 획득한 채 다른 트랜잭션이 소유하고 있는 잠금을 요구하면 아무리 기다려도 상황이 바뀌지 않는 상태가 되는데, 이를 교착상태라고 한다.

예를 들면, 두 개의 A, B 테이블이 있고 각각의 다른 1번, 2번 트랜잭션이 테이블의 잠금을 획득한다고 가정해보자.

1번 트랜잭션이 B의 잠금을 획득 2번 트랜잭션이 A의 잠금을 획득

이 상태에서 트랜잭션을 commit 하지 않은채 서로의 첫 번째 행에 대한 잠금을 요청하면 Deadlock이 발생한다.

교착상태의 빈도를 낮추는 방법

  1. 트랜잭션을 자주 커밋한다.
  2. 정해진 순서로 테이블에 접근하게 한다.
  3. 읽기 잠금 획득의 사용을 피한다.
  4. 한 테이블의 복수 행을 복수의 연결에서 순서 없이 갱신하면 교착 상태가 발생하기 쉽다. 이 때에는 테이블 단위의 잠금을 획득하여 갱신을 직렬화 하면 동시성은 떨어지지만 교착상태를 회피할 수 있다.