데이터베이스 2 - 모델링, 정규화, 트랜잭션, 격리수준, ...

출처 도서 - MySQL로 배우는 데이터베이스 이론과 실습

  • 모델링
    개념적 모델링, 논리적 모델링, 물리적 모델링

  • 정규화
    1. 제 1 정규화 : 속성값은 모두 원자값이어야 한다.

    2. 제 2 정규화 : 기본키가 복합키일 때, 복합키 중 다른 속성의 결정자가 있으면 안 된다.
    예를 들어, A B C D 속성이 있으며 A와 B가 기본키라고 하자.
    기본키(A와 B)가 C의 결정자가 아닌 B만이 C의 결정자인 경우 문제가 발생한다.
    그렇다면 A와 B가 기본키인 A, B, D 속성이 있는 테이블과
    B가 기본키인 B, C 속성이 있는 테이블로 테이블 분리를 시행하는 것이 해결 방법이 된다.

    3. 제 3 정규화
    : 속성들이 이행적으로 종속되어 있으면 안 된다.
    A -> B -> C 라면, A -> B, B -> C로 분리해야한다.

    4. BCNF : 후보키가 아닌 속성이 다른 속성의 결정자이면 문제가 됨
    결정자를 기본키로 테이블을 분리 변경해야한다.

 

  • 트랜잭션 : 데이터 처리 단위. all or nothing.
    원자성(Automicity), 일관성(Consistency), 고립성(Isolation), 지속성(Durability)
    • 동시성 제어
      • : 트랜잭션이 데이터를 읽거나 수정할 때 데이터에 표시하는 잠금 장치.
        • 공유락 : 읽기용 락
        • 배타락 : 읽기/쓰기용 락 -> 둘 다 안 됨
        • 락이 걸려있으면 대기 상태가 된다.
        • 락 유지시간으로 인해 락 해제 발생 가능 -> 이 때는 2단계 락킹을 이용.
        • 데드락 발생할 수 있음 -> 하나 강제로 중지 작업 필요

 

    • 고립 수준
      • READ UNCOMMITTED : 커밋되지 않은 데이터 읽어들임(오손 읽기)
      • READ COMMITTED : 커밋된 데이터만 읽어들임
        다른 트랜잭션에서 update + commit된 데이터 읽힘(반복불가능 읽기; 데이터 불일치 문제)
      • REAPEATABLE READ :
        반복불가능 읽기 문제 방지
        하지만 다른 트랜잭션에서 insert + commit된 데이터 나타나는 유령 데이터 현상 있음
      • SERIALIZABLE : select에 공유락 설정. 성능에 안 좋음

 

  • JPA와 트랜잭션, 락
    • 보통은 READ COMMITTED 수준에서 낙관적 락, 비관적 락 사용
    • @Version : JPA에서의 낙관적 락 -> 트랜잭션이 충돌하지 않을 것으로 가정하기에 충돌이 난 후 롤백
      예외 처리로 다시 업데이트 시도도 가능
    • @Lock : READ, WRITE, NONE
      READ가 JPA의 비관적 락 -> 트랜잭션이 충돌할 것으로 가정하기에 조회할 때부터 락; select for update

 

댓글을 작성해보세요.