[Database] Transaction

Bik_Kyun·2022년 5월 1일
0
post-thumbnail
post-custom-banner

1. Transaction이란

데이터베이스의 상태를 변화시키기 위해 수행하는 하나의 작업 단위.

데이터베이스의 성질 중 하나인 완전성(integrity)을 확보하기 위한 것.

기본적으로 각각의 SQL문(SELECT, INSERT, DELETE, UPDATE)이 하나의 트랜잭션으로 취급된다.
(두 개 이상의 SQL문들을 하나의 트랜잭션으로 취급하려면 사용자가 이를 명시적으로 표시해야 한다.)

만약 쿼리 하나가 실패하면, 데이터베이스 시스템은 전체 트랜잭션 또는 실패한 쿼리를 ROLLBACK한다.
트랜잭션은 COMMIT전에 언제든지 수동으로 ROLLBACK될 수 있다.

2. ACID

Transaction은 아래와 같은 네 가지 특성을 만족해야 한다.

1) Atomicity(원자성)

원자성은 한 트랜잭션 내의 모든 연산들이 완전히 수행되거나 전혀 수행되지 않음(all or nothing)을 의미한다.
즉, 한 트랜잭션의 모든 연산이 데이터베이스에 완전히 반영되거나 전혀 반영되지 않아야 한다.
시스템이 다운되는 경우에 DBMS의 회복 모듈은 부분적으로 데이터베이스를 갱신한 트랜잭션의 영향을 취소함으로써 트랜잭션의 원자성을 보장한다. 또한 완료된 트랜잭션이 갱신한 사항은 트랜잭션의 영향을 재수행함으로써 트랜잭션의 원자성을 보장한다.

2) Consistency(일관성)

한 트랜잭션을 정확하게 수행하고 나면 데이터베이스가 하나의 일관된 상태에서 다른 일관된 상태로 바뀐다.
어떤 트랜잭션이 수행되기 전에 데이터베이스가 일관된 상태를 가졌다면 트랜잭션이 수행된 후에 데이터베이스는 또 다른 일관된 상태를 갖는다.

다만, 트랜잭션이 수행되는 도중에는 데이터베이스가 일시적으로 일관된 상태를 갖지 않을 수 있다. 일관성은 트랜잭션을 작성하는 응용프로그래머와 무결성 제약조건을 유지하는 DBMS의 일부 모듈이 유지한다.
동시에 다수 사용자가 데이터베이스를 접근하여 검색 및 갱신 연산을 수행하는 환경에서 무결성 제약조건만 검사해서는 데이터베이스의 일관성을 보장할 수 없다. DBMS의 동시성 제어 모듈이 다수 사용자의 서로 상충되는 데이터베이스 접근을 조정해야 한다.

3) Isolation(고립성)

한 트랜잭션이 데이터를 갱신하는 동안 이 트랜잭션이 완료되기 전에는 갱신 중인 데이터를 다른 트랜잭션들이 접근하지 못하도록 해야 한다.
고립성은 다수의 트랜잭션이 동시에 수행되는 상황을 다룬다. 즉 각 트랜잭션은 시스템 내에서 동시에 수행되고 있는 다른 트랜잭션들을 알지 못한다. 다수의 트랜잭션들이 동시에 수행되더라도 그 결과는 어떤 순서에 따라 트랜잭션들을 하나씩 차례대로 수행한 결과와 같아야 한다. 만일 초기의 데이터베이스 상태가 일관적이고 정확하게 실세계의 상태를 반영한다면, 일관된 트랜잭션들의 집합을 차례로 수행하면 이런 성질을 보존한다. 그러므로 트랜잭션들의 직렬 수행은 일관성을 보존한다.
그러나 성능상의 관점에서는 직렬 수행이 적절치 않다. 트랜잭션들의 집합을 동시 수행하면 성능이 향상되는 효과를 얻을 수 있지만 결과가 정확하지 않을 수 있다. 이 때, DBMS의 동시성 제어 모듈이 트랜잭션의 고립성을 보장한다. DBMS는 응용들의 요구사항에 따라 다양한 Isolation Level(고립 수준)을 제공한다.

Isolation Level

4) Durability(지속성)

일단 한 트랜잭션이 완료되면 이 트랜잭션이 갱신한 것은 그 후에 시스템에 고장이 발생하더라도 손실되지 않는다.
완료된 트랜잭션의 효과는 시스템이 고장난 경우에도 데이터베이스에 반영되며 DBMS의 회복 모듈은 시스템이 다운되는 경우에도 트랜잭션의 지속성을 보장한다.

3. Transaction Flow

트랜잭션 연산
1. COMMIT

  • 완료(성공적인 종료)
  • 트랜잭션이 성공적으로 끝났음
  • 데이터베이스는 새로운 일관된 상태를 가짐
  • 트랜잭션이 수행한 갱신을 데이터베이스에 반영해야 함

2. ROLLBACK

  • 철회(비성공적인 종료)
  • 트랜잭션의 일부를 성공적으로 끝내지 못했음
  • 데이터베이스가 불일치 상태를 가질 수 있음
  • 트랜잭션이 수행한 갱신이 데이터베이스에 일부 반영되었다면 취소해야 함
  • Active(활성) : 트랜잭션이 실행중
  • Partially Committed(부분 완료) : 트랜잭션의 마지막 연산까지 실행되었으나 COMMIT 연산이 실행되기 직전의 상태
  • Committed(완료) : 트랜잭션이 성공적으로 종료되어COMMIT 연산까지 마친 상태
  • Failed(실패) : 트랜잭션에 오류가 발생하여 중지된 상태
  • Aborted(철회) : 트랜잭션이 실패되어 ROLLBACK을 마친 상태

4. Transaction시 주의할 점

데이터베이스 Connection 개수가 제한적이기 때문에 Transaction 범위를 최소화해야 한다.
Connection을 소유하는 시간이 길어질수록 사용 가능한 Connection의 수는 줄어든다.

교착 상태

두 개 이상의 트랜잭션이 특정 자원의 잠금을 획득한 채 다른 트랜잭션이 소유하고 있는 잠금을 요구하여 아무리 기다려도 상황이 바뀌지 않는상태

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

  • 트랜잭션을 자주 COMMIT
  • 정해진 순서대로 테이블에 접근
    트랜잭션 1이 테이블 B->A 순으로 접근했고, 트랜잭션 2는 테이블 A->B 순으로 접근했다.
    트랜잭션들이 동일한 테이블 순으로 접근하게한다.
  • 읽기 잠금 획득(SELECT ~ FOR UPDATE) 사용을 피함
  • 테이블 단위의 잠금을 획득해 갱신을 직렬화
    한 테이블의 복수 행을 복수의 연결에서 순서 없이 갱신하면 교착 상태가 발생하기 쉽다.
    이 경우에는 테이블 단위의 잠금을 획득해 갱신을 직렬화하면 동시성은 떨어지나 교착상태를 회피할 수 있다.
profile
비진
post-custom-banner

0개의 댓글