Home Transaction, Normalization
Post
Cancel

Transaction, Normalization

트랜잭션이란?

성공, 실패 두결과만 존재한다.

트랜잭션은 여러개의 작업을 하나로 묶은 실행 유닛이다.
각 트랜잭션은 하나의 특정 작업으로 시작을 해 묶여 있는 모든 작업들을 다 완료해야 정상적으로 종료된다.
여러개의 작업 중 단 하나의 작업을 실패하면 실패한 트랜잭션이라는 소리다.(롤백)
아래의 코드가 롤백과 커밋을 나타낸 예이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Main {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("test");

        EntityManager em = emf.createEntityManager(); // 엔티티매니저
        EntityTransaction tx = em.getTransaction(); //트랜젝션의 시작
        tx.begin();
        try {
            //저장할 데이터~~
            Member member = new Member();
            member.setId(1L);
            member.setName("Student A");
            em.persist(member); // 저장

            tx.commit(); //커밋
        } catch (Exception e) {
            tx.rollback(); // 문제 발생시 롤백
        } finally {
            em.close(); //트랜잭션 종료
        }

        emf.close(); //엔티니매니저 종류

    }
}

ACID

ACID는 데이터베이스 내에서 일어나는 하나의 트랜잭션(transaction)의 안전성을 보장하기 위해 필요한 성질이다.

Atomicity(원자성)

원자성은 하나의 트랜잭션에 속해있는 모든 작업이 전부 성공하거나 전부 실패해서 결과를 예측할 수 있어야 한다. 예를 들어 계좌이체를 할 때에는…

A 계좌에서 출금합니다. B 계좌에 입금합니다.

계좌이체를 하려는데 A 계좌에서는 출금이 이뤄지고, B 계좌에 입금되지 않았다고 가정해보자. 어디서 문제가 발생했는지 파악할 수 없다면, A 계좌에서 출금된 돈은 세상에서 사라지는 돈이 된다. 만약 은행에서 이런 일이 발생한다면, 그 은행은 문을 닫아야한다. A 계좌에서 출금하는 일에 성공했지만, B 계좌에 입금하는 작업에 실패한다면 계좌 A에서 출금하는 작업을 포함하여 모든 작업이 실패로 돌아가야 한다는 것이 Atomicity(원자성)

SQL에서도 마찬가지이다. 특정 쿼리를 실행했는데 부분적으로 실패하는 부분이 있으면, 전부 실패하도록 구현되어 있다. 때때로 충돌 요인에 대해서 선택지를 제공한다.

Consistency(일관성)

데이터베이스의 상태가 일관되어야 한다는 성질이다. 하나의 트랜잭션 이전과 이후, 데이터베이스의 상태는 이전과 같이 유효해야 한다. 다시 말해, 트랜잭션이 일어난 이후의 데이터베이스는 데이터베이스의 제약이나 규칙을 만족해야한다.

예를 들어 ‘모든 고객은 반드시 이름을 가지고 있어야 한다’는 데이터베이스의 제약이 있다고 가정해보자. 그러면 다음과 같은 트랜잭션은 Consistency(일관성)를 위반한다.

이름 없는 새로운 고객을 추가하는 쿼리 기존 고객의 이름을 삭제하는 쿼리

데이터베이스의 유효한 상태는 다를수 있지만, 데이터의 상태에 대한 일관성은 변하지 않아야한다. 이 예시는 ‘이름이 있어야 한다’ 라는 제약을 위반한다. 따라서 예시처럼 트랜잭션이 일어난 이후의 데이터베이스는 일관되지 않는 상태를 가지게 된다.

Isolation(격리성, 고립성)

Isolation(격리성) 은 모든 트랜잭션은 다른 트랜잭션으로부터 독립되어야 한다. 실제로 동시에 여러 개의 트랜잭션들이 수행될 때, 각 트랜젝션은 고립(격리)되어 있어 연속으로 실행된 것과 동일한 결과를 나타낸다.

A에게 계좌에 만원이 있는 상태

A 계좌로부터 계좌 B로 6천 원을, 계좌 C로 6천 원을 동시에 계좌 이체하는 경우, 계좌 B에 먼저 송금한 뒤 계좌 C에 보내는 결과와 동일한다. 동시에 트랜잭션을 실행한다고 해서 계좌 B와 C에 각각 6천 원씩 송금하여 마이너스 통장이 되는 것이 아니다. 각각의 송금 작업을 연속으로 실행하는 것과 동일한 결과가 나타나야 한다. 격리성을 지키는 각 트랜젝션은 철저히 독립적이기 때문에, 다른 트랜젝션의 작업 내용을 알 수 없어야 하고 데이터베이스 상태가 동일해야 한다.

Durability(지속성)

Durability(지속성)는 하나의 트랜잭션이 성공적으로 수행되었다면, 해당 트랜잭션에 대한 로그가 남아야 한다. 만약 런타임 오류나 시스템 오류가 발생하더라도, 해당 기록은 영구적으로 남아야한다.

은행에서 게좌이체를 성공적으로 실행한 뒤에, 해당 은행 데이터베이스에 오류가 발생해 종료되더라도 계좌이체 내역은 기록으로 남아야한다.

마찬가지로 계좌이체를 로그로 기록하기 전에 시스템 오류 등에 의해 종료가 된다면, 해당 이체 내역은 실패로 돌아가고 각 계좌들은 계좌이체 이전 상태들로 돌아가게 된다.

데이터베이스 정규화

정규화(Normalization)의 기본 목표는 테이블 간에 중복된 데이터를 허용하지 않는다는 것이다. 중복된 데이터를 허용하지 않음으로써 무결성(Integrity)를 유지할 수 있으며, DB의 저장 용량 역시 줄일 수 있다.
이를 지키지 않았을떄 어떤 문제점이 생기는지 나열해보겠다.

Data Redundancy

데이터 중복 (data redundancy) 는 실제 데이터의 동일한 복사본이나 부분적인 복사본을 뜻한다.
물론 이러한 중복성으로 데이터를 복구할 때에 더 수월할 수도 있겠지만 데이터베이스 내에서는 몇가지 문제점들을 대체로 지닌다.

  1. 일관된 자료 처리의 어려움
  2. 저장 공간 낭비
  3. 데이터 효율성 감소

Data Integrity

데이터 무결성 (data integrity) 는 데이터의 수명 주기 동안 정확성과 일관성을 유지하는 것을 뜻한다.
즉, 입력된 데이터가 오염되지 않고 입력된 그대로 데이터를 사용할 수 있다는 뜻이다.

Anomaly

데이터 이상 현상 (anomaly) 와 같은 경우에는 데이터에서 기대한 것과 다른 이상 현상을 가리킨다.

Update Anomaly

갱신 이상 (update anomaly) 는 동일한 데이터가 여러 행 (레코드) 에 걸쳐 있을 때에 어느 데이터를 갱신해야 하는지에 대한 논리적 일관성이 없어 발생하게 되는 경우다.

사원ID사원주소스킬스택
123강남구 대치동파이썬
123강남구 대치동C++
321강남구 도곡동자바
321강원도 양양시C

다음과 같은 테이블이 존재하고 두 개의 레코드가 동일한 사람일 때에 (321번) 갱신을 하게 되는 경우 어떤 데이터를 해야 하는지에 대한 문제가 발생한다.

Insertion Anomaly

삽입 이상 (insertion anomaly) 는 데이터 삽입을 못하는 경우를 가리킨다.
|사원ID|사원이름|배정받은 부서| |—|—|—| |123|아무개|홍보| |321|김철수|기획| |213|이영희|개발| 갈곳 없음↓ |654|홍길동| | |—|—|—|

다음과 같은 경우 새로운 직원이 들어왔을 때에 (홍길동) 아직 가르칠 부서가 정해지지 않은 경우에는 데이터에 추가되지 못하게 된다. (이럴 경우 NULL값으로 삽입하면 된다.)

Deletion Anomaly

삭제 이상 (deletion anomaly) 와 같은 경우에는 데이터의 특정 부분을 지울 때에 의도치 않게 다른 부분들도 함께 지워지는 이상 현상이다. 예를들어 한 직원 데이터의 수업 관련 데이터를 지우기 위해서는 레코드 전체가 사라져서 결국에는 의도치 않게 직원의 다른 데이터들도 같이 삭제되는 현상이 발생하게 되는 경우다.

This post is licensed under CC BY 4.0 by the author.