트랜잭션 ~ 무결성 제약

Next

TL;DR

여러 사용자가 규칙없이 데이터를 입력하면 데이터 베이스는 엉망이 될 수 있다. 이를 방지하기 위한 대표적인 기법이 데이터 무결성과 제약 조건, 트랜잭션과 동시성 제어다.




무결성 제약 조건


1) 개체 무결성 제약조건 (Entity Integrity Constraint)


2) 참조 무결성 제약조건 (Reference Integrity Constraint)


3) 도메인 제약조건 (Domain Constraint)




트랜잭션



트랜잭션 특징 (ACID)

ACID는 데이터 베이스에서 트랜잭션의 안전성을 보장하기 위한 성질입니다.

예를 들면, 계좌 이체에서 나의 계좌에서 10만원을 빼고, A에게 10만원을 추가하는 종합적인 과정이 트랜잭션입니다.


  1. 원자성 (Atomicity)
    • 트랜잭션의 연산들이 모두 정상적으로 실행되거나 하나도 실행되지 않아야 한다. all-or-nothing
    • 원자성 보장을 위해 장애 발생시 회복 기능이 필요하다.
  2. 일관성 (Consistency)
    • 트랜잭션이 성공적으로 수행된 후에도 데이터베이스가 일관성 있는 상태를 유지해야 한다.
    • 트랜잭션이 일어난 이후에도 데이터베이스의 제약이나 규칙을 만족해야 한다.
  3. 격리성 (Isolation)
    • 수행 중인 트랜잭션이 완료될 때까지 다른 트랜잭션들이 중간 연산 결과에 접근할 수 없다.
    • Locking 사용
  4. 지속성 (Durability)
    • 트랜잭션이 성공적으로 완료된 후 데이터베이스에 반영된 수행 결과는 영구적이어야 한다.



트랜잭션의 주요 연산

  1. commit
  1. rollback


동시성 제어 (Concurency Control)


로킹 (Locking)


2단계 로킹 프로토콜 (2PL)


Lock의 설정 범위


트랜잭션의 Isolation Level


👆 여기서 잠깐! <용어 정리하고="" 들어가기="">

DIRTY READ : 어떤 트랜잭션에서 처리한 작업이 완료되지 않았음에도 다른 트랜잭션에서 볼 수 있게 되는 현상

NON-REAPEATABLE READ : 한 트랜잭션에서 같은 쿼리를 두 번 수행할 때 그 사이에 다른 트랜잭션 값을 수정 또는 삭제하면서 두 쿼리의 결과가 상이하게 나타나는 일관성이 깨진 현상

PHANTOM READ : 한 트랜잭션 내에서 동일한 쿼리를 두 번 수행했는데 첫번째 쿼리에서 존재하지 않았던 레코드가 두번째 쿼리에서 나타나는 현상

UNDO RECORD : 데이터 갱신으로 테이블을 변경할 때 변경하기 전의 데이터를 보관하는 곳


Level 0) Read Uncommitted

Select 문장을 수행하는 경우 해당 데이터Shared Lock이 걸리지 않는 Level


Level1) Read Committed

Select 문장이 수행되는 동안 해당 데이터에 Shared Lock 걸린다.


Level2) Reapeatable Read

트랜잭션이 완료될 때까지 Select 문장이 사용하는 모든 데이터에 Shared Lock이 걸린다.

→ Phantom Read 발생


Level3) Serializable Read




교착상태


👆 여기서 잠깐!

읽기 잠금 모드 : LOCK IN SHARE OPTION

→ 데이터를 읽을 때 사용하는 Read Lock의 개념으로 공유 잠금끼리는 충돌이 없다.

쓰기 잠금 모드 : FOR UPDATE

→ 데이터를 쓸 때 사용하는 Write Lock의 개념으로 공유 잠금과 배타 잠금 모두에게 충돌이 발생한다.


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


교착 상태 회피기법




질문

은행 계좌 데이터 베이스이 관계형 데이터 베이스이고, 이름/잔액 두 가지 column을 가진다고 하자. A가 B에게 만원을 송금할 때, 실제로 데이터 베이스에서는 어떤 과정으로 이루어질까요?



트랜잭션을 보장하기위해 DBMS에는 무엇이 필요할까요?

예를 들면 트랜잭션에서 rollback 하는 경우 이전 데이터로 복구를 해야하는데, 이를 DBMS에서는 어떻게 지원해줄 수 있을까요?


트랜잭션에서 Isolation 을 보장하기위해 모든 트랜잭션을 직렬로 수행한다면 처리 시간이 너무 오래걸릴텐데 이것을 어떻게 해결할 수 있나요?


트랜잭션과 Locking은 각각 무엇을 위한 기능인가요?

잠금은 동시성을 제어하기 위한 기능이고 트랜잭션은 데이터의 정합성을 보장하기 위한 기능


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

트랜잭션은 최소한의 SQL문에만 적용하는 것이 좋다.

→ 데이터 베이스의 커넥션의 개수는 제한적인데, 하나의 프로그램이 커넥션을 소유하는 시간이 길어지면 여유 커넥션의 개수가 줄어들이 때문이다. 트랜잭션을 과하게 적용할 경우 프로그램에서 커넥션을 가져가기 위해 기다려야 하는 상황이 발생할 수도 있다.


표준 SQL에서 제약 조건을 표시하기 위해 제공하는 것에는 무엇이 있나요?

1) 개체 무결성 제약조건


2) 참조 무결성 제약조건 (Reference Integrity Constraint)




References