[데이터베이스] 트랜잭션과 교착상태

공혁준·2022년 5월 3일
0

데이터베이스

목록 보기
4/4
post-thumbnail

📌 트랜잭션과 교착상태를 다룹니다.

트랜잭션

트랜잭션이란?

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

상태를 변화시킨다는 것 -> SQL 질의어를 통해 DB에 접근하는 것

- SELECT
- INSERT
- DELETE
- UPDATE

작업 단위 -> 많은 SQL 명령문들을 사람이 정하는 기준에 따라 정하는 것

예시) 사용자 A가 사용자 B에게 만원을 송금한다.

* 이때 DB 작업
- 1. 사용자 A의 계좌에서 만원을 차감한다 : UPDATE 문을 사용해 사용자 A의 잔고를 변경
- 2. 사용자 B의 계좌에 만원을 추가한다 : UPDATE 문을 사용해 사용자 B의 잔고를 변경

현재 작업 단위 : 출금 UPDATE문 + 입금 UPDATE문
→ 이를 통틀어 하나의 트랜잭션이라고 한다.
- 위 두 쿼리문 모두 성공적으로 완료되어야만 "하나의 작업(트랜잭션)"이 완료되는 것이다. `Commit`
- 작업 단위에 속하는 쿼리 중 하나라도 실패하면 모든 쿼리문을 취소하고 이전 상태로 돌려놓아야한다. `Rollback`

즉, 하나의 트랜잭션 설계를 잘 만드는 것이 데이터를 다룰 때 많은 이점을 가져다준다.

트랜잭션의 특징 (ACID)

  • 원자성(Atomicity)
    트랜잭션이 DB에 모두 반영되거나, 혹은 전혀 반영되지 않아야 된다.

  • 일관성(Consistency)
    트랜잭션의 작업 처리 결과는 항상 일관성 있어야 한다.

  • 독립성(Isolation)
    둘 이상의 트랜잭션이 동시에 병행 실행되고 있을 때, 어떤 트랜잭션도 다른 트랜잭션 연산에 끼어들 수 없다.

  • 지속성(Durability)
    트랜잭션이 성공적으로 완료되었으면, 결과는 영구적으로 반영되어야 한다.

트랜잭션 상태

  • Active : 트랜잭션이 실행중인 상태(SQL 실행)
  • Parital Commit : 트랜잭션의 마지막 연산까지 실행했지만, commit 연산이 실행되기 직전의 상태
  • Commited : 트랜잭션이 성공적으로 종료되고 commit 연산까지 실행 완료된 상태
  • Failed : 트랜잭션 실행에 오류가 발생한 상태
  • Aborted: 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태

트랜잭션 명령어

Commit
하나의 트랜잭션이 성공적으로 끝났고, DB가 일관성 있는 상태일 때 이를 알려주기 위해 사용하는 연산

Rollback
하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션 원자성이 깨진 경우

트랜잭션 발생 가능 문제

Dirty Read Problem

한 트랜잭션 진행 중에 변경한 값을 다른 트랜잭션에서 읽을 때 발생한다. 커밋되지 않은 상태의 트랜잭션을 다른 트랜잭션에서 읽을 수 있을 때 발생하는 문제이다.

Non-repeatable Read Problem

한 트랜잭션에서 같은 값을 두 번 이상 읽었을 때 그 값이 다른 경우를 말한다. 한 트랜잭션 도중 다른 트랜잭션이 커밋되면 발생할 수 있는 문제이다.

Phantom Read Problem

한 트랜잭션에서 같은 쿼리문을 두 번 이상 실행했을 때 새로운 데이터가 조회되는 경우를 말한다. A 트랜잭션 도중 B 트랜잭션에서 update 쿼리를 수행하고 커밋하더라도 A 트랜잭션에서 그 결과는 볼 수 없지만, A 트랜잭션 도중 B 트랜잭션에서 insert 쿼리를 수행할 경우 A 트랜잭션에서 처음에 안 보였던 새로운 데이터가 조회될 수 있다.

교착상태

교착상태란?

교착상태(Dead Lock)는 상호 배제에 의해 나타나는 문제점으로, 둘 이상의 프로세스들이 자원을 점유한 상태에서 서로 다른 프로세스가 점유하고 있는 자원을 요구하며 무한정 기다리는 현상을 의미한다.

교착상태 발생의 필요 충분 조건

교착상태가 발생하기 위해서는 다음의 네 가지 조건이 충족되어야 하는데, 이 네 가지 조건 중 하나라도 충족되지 않으면 교착상태는 발생하지 않는다.

  1. 상호배제(Mutual Exclusion)
    한번에 한개의 프로세스만이 공유 자원을 사용할 수 있어야 한다.

  2. 점유와 대기(Hold and Wait)
    최소한 하나의 자원을 점유하고 있으면서 다른 프로세스에 할당되어 사용되고 있는 자원을 추가로 점유하기 위해 대기하는 프로세스가 있어야 한다.

  3. 비선점(Non-preemption)
    다른 프로세스에 할당된 자원은 사용이 끝날 때까지 강제로 뺴앗을 수 없어야 한다.

  4. 환형 대기(Circular Wait)
    공유자원과 공유자원을 사용하기 위해 대기하는 프로세스들이 원형으로 구성되어 있어 자신에게 할당된 자원을 점유하면서 앞이나 뒤에 있는 프로세스의 자원을 요구해야 한다.

예방기법 (Prevention)

교착상태 예방 기법은 교착상태가 발생하지 않도록 사전에 시스템을 제어하는 방법으로 교착상태 발생의 네가지 조건 중에서 어느 하나를 제거함으로써 수행된다. 자원 낭비가 가장 심한 기법이다.

  1. 상호 배제(Mutual Exclusion) 부정
    한번에 여러개의 프로세스가 공유 자원을 사용할 수 있도록 한다.

  2. 점유 및 대기(Hold and Wait) 부정
    프로세스가 실행되기 전 필요한 모든 자원을 할당하여 프로세스 대기를 없애거나 자원이 점유되지 않은 상태에서만 자원을 요구하도록 한다.

  3. 비선점(Non-preemption)부정
    자원을 점유하고 있는 프로세스가 다른 자원을 요구할 때 점유하고 있는 자원을 반납하고, 요구한 자원을 사용하기 위해 기다리게 한다.

  4. 환형 대기(Circular Wait)부정
    자원을 선형 순서로 분류하여 고유 번호를 할당하고, 각 프로세스는 현재 점유한 자원의 고유 번호보다 앞이나 뒤 어느 한쪽 방향으로만 자원을 요구하도록 하는 것이다.

회피기법 (Avoidance)

교착상태 회피 기법은 교착상태가 발생할 가능성을 배제하지 않고 교착상태가 발생하면 적절히 피해나가는 방법으로, 주로 은행원 알고리즘(Banker's Algorithm)이 사용된다.

은행원 알고리즘

  1. 은행원 알고리즘은 다익스트라가 제안한 기법으로, 은행에서 모든 고객의 요구가 충족되도록 현금을 할당하는데서 유래한 기법이다.
  2. 각 프로세스에게 자원을 할당하여 교착상태가 발생하지 않으며 모든 프로세스가 완료될 수 있는 상태를 안전상태, 교착상태가 발생할 수 있는 상태를 불안전 상태라고 한다.
  3. 은행원 알고리즘을 적용하기 위해서는 자원의 양과 사용자(프로세스) 수가 일정해야 한다.
  4. 은행원 알고리즘은 프로세스의 모든 요구를 유한한 시간안에 할당하는 것을 보장한다.

발견기법 (Detection)

교착상태 발견 기법은 시스템에 교착상태가 발생했는지 점검하여 교착상태에 있는 프로세스와 자원을 발견하는 것을 의미한다.

  1. 교착상태 발견 알고리즘과 자원 할당 그래프 등을 사용 할 수 있다.

회복기법 (Recovery)

교착상태 회복 기법은 교착상태를 일으킨 프로세스를 종료하거나 교착상태의 프로세스에 할당된 자원을 선점하여 프로세스나 자원을 회복하는 것을 의미한다.

프로세스 종료

교착상태에 있는 프로세스를 종료하는 것으로, 교착상태에 있는 모든 프로세스를 종료하는 방법과 교착상태에 있는 프로세스들을 하나씩 종료해가며 교착상태를 해결하는 방법이 있다.

자원선점

교착상태의 프로세스가 점유하고 있는 자원을 선점하여 다른 프로세스에게 할당하며, 해당 프로세스를 일시 정지시키는 방법이다. 우선순위가 낮은 프로세스, 수행된 정도가 적은 프로세스, 사용되는 자원이 적은 프로세스 등을 위주로 해당 프로세스의 자원을 선점한다.

참고

https://github.com/gyoogle/tech-interview-for-developer
https://github.com/Seogeurim/CS-study
https://coding-factory.tistory.com/311

profile
몰입을 즐기는 개발자입니다.

0개의 댓글