[Database] 트랜잭션과 ACID & 트랜잭션 격리 수준과 데드락
2021. 12. 17. 10:30
트랜잭션이란?
- DBMS에서 하나의 최소한의 작업 단위이다.
- 여러 사람이 데이터베이스를 동시에 사용하더라도 데이터에 문제가 없어야 한다.
- 원자성, 일관성, 격리성, 지속성 = ACID가 지켜져야 함.
- ex) 입출금 시스템
ACID 특성
- 원자성(Atomicity) : 트랜잭션이 수행하는 연산들을 모두 정상적으로 처리하거나 모두 처리하지 않아야 한다는 all-or-nothing 방식
- 일관성(Consistency) : 데이터베이스의 데이터는 일관된 상태를 유지해야 한다. ( = 미리 정의된 규칙에만 수정이 가능해 숫자 컬럼에 문자열값 X) //트랜잭션의 결과가 제약 조건을 해치면안된다.
- 격리성(Isolation) : 하나의 트랜잭션이 완료될 때까지 다른 트랜잭션이 간섭하지 못하도록 하여 각각의 트랜잭션이 독립적으로 수행되어야 한다.
- 지속성(Durability) : 트랜잭션이 성공적으로 완료된 이후에 데이터베이스의 데이터들이 영구적으로 보존되어야 한다. ( = 한 번 커밋된 내용은 영원히 적용)
트랜잭션 원자성을 위한 지키기위한 순서
- 쿼리실행
- 쿼리처리를 통해 필요한 데이터가 데이터 캐시가 없다면 데이터 파일에서 데이터 캐시에 저장
- Redo 로그에는 변경 후의 값을 저장하고 Undo 로그에는 변경 전의 값을 저장
- 이후 데이터 캐시 값을 변경
- ROLLBACK 을 할 경우 UnDo로그를 통해 역순으로 데이터를 복구한다.
- 롤백 이외에 예기치 못한 오류가 발생하면 ReDo 로그를 통해 데이터를 일관성있게 만들어 준다.
- 결론 : 수행하고 있는 트랜잭션에 의해 변경된 내역과 이전에 commit 된 상태를 임시 영역에 따로 저장한다. 트랜잭션 오류 발생시 임시 저장된 데이터들을 기반으로 복구한다.
- 이전 데이터가 임시 저장되는 영역을 롤백 세그먼트라고 한다.
→ 로그 기반 회복 기법
→ 체크포인트 기반 회복 기법도 있음
일관성 보장
- 트리거를 통해 보장
고립성 보장
- 트랜잭션은 성능을 위해 병행처리를 수행한다.
- 이 경우 공통된 데이터를 조작하게 되어 고립성을 해칠 수 있다.
- lock & excute unlock을 통해 고립성 보장 가능
- 데이터를 읽거나 쓸 때는 문을 잠궈 다른 트랜잭션이 접근하지 못하도록 고립성을 보장하고, 수행을 마치면 unlock을 통해 데이터를 다른 트랜잭션이 접근할 수 있게 함
- shared_lock은 데이터 쓰기를 허용하지 않고 오직 읽기만 허용 → 데이터를 읽기만 할때는 여러 트랜잭션이 읽을 수 있음 = 공유lock
- 데이터를 쓸 때는 다른 트랜잭션이 읽을수도 쓸 수 도 없는 exclusive_lock을 사용한다. → 데드락에 빠질 수 있음 = 배타적 lock
트랜잭션 격리 수준
- Read Uncommitted
- 트랜잭션 시작 후 아직 Commit되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용
- 데이터베이스의 일관성을 유지하는 것이 불가능
- Dirty Read 발생
- read committed
- 트랜잭션 시작 후 Commit이 된 데이터만 조회 가능
- Oracle DB, SQl Server에서 기본적으로 사용하는 Isolation Level
- Non-Repeatable Read 발생
- B 트랜잭션에서 10 번 사원의 나이를 조회 : 27
- A 트랜잭션에서 나이 변경 27 → 28
- B 트랜잭션에서 나이 조회 : 28
- Non-Repeatable Read 발생
- repeatable read
- 트랜잭션 시작 전 commit된 내용만 조회 가
- 트랜잭션 영역에 해당되는 데이터 수정 불가능
- MySQL DBMS가 사용
- Phantom Read 발생
- 한 트랜잭션 안에서 일정 범위의 레코드를 두 번 이상 읽었을 때 첫번째 쿼리에서 없던 레코드가 두번째 쿼리에서 나타나는 현상
- 트랜잭션 도중 새로운 레코드 삽입을 허용하기 때문에 발생
4. serializable
- 트랜잭션이 사용하는 영역의 데이터에 대한 수정 및 입력 불가능
- 완벽한 읽기 일관성 모드를 제공
- Dirty Read란
- 유효하지 않은 데이터를 읽음
- A트랜잭션에서 10번 사원의 나이를 27 → 28 변경
- A가 commit되기전에 B트랜잭션에서 10번 사원의 나이를 조회 = 28
- 이후 A에 문제가 발생해서 Rollback 하면 B는 28인줄 알고있기 때문에 데이터 정합성에 문제가 생김
- 유효하지 않은 데이터를 읽음
- Non-Repeatable Read
- 두번의 쿼리 조회 결과가 다름
- A가 500번 사원 조회
- B가 500 사원 이름 변경 후 커밋
- A가 500번 사원 조회 : Undo 영역에 백업된 데이터 반환
- 두번의 쿼리 조회 결과가 다름
- Phantom Read
- 일정 범위의 레코드를 두 번 이상 읽을 때 이전에 없던 레코드가 나타남
트랜잭션 데드락
- 두 개 이상의 트랜잭션이 특정 자원을 획득한 채 다른 lock을 요구하면 상태가 바뀌지 않는 교착상태를 의미
2 phase locking
- 여러 트랜잭션이 공유하고 있는 데이터에 동시에 접근할 수 없도록 하는 프로토콜
- growing phase (상승단계) : lock과 unlock이 번갈아 수행되지 않고 lock을 할때는 쭉 lock을 수행
- shrinking phase(하강단계) :lock이 끝난 후 모든 unlock을 수행
- DBMS는 일관성을 유지하기 위해 무결성 제약조건을 활용함.
- DBMS는 고립성을 유지하기 위해 동시성 제어 알고리즘을 작동시킴.
- DBMS는 지속성을 유지하기 위해 회복 관리자 프로그램을 이용함.트랜잭션이란?
- DBMS에서 하나의 최소한의 작업 단위이다.
- 여러 사람이 데이터베이스를 동시에 사용하더라도 데이터에 문제가 없어야 한다.
- 원자성, 일관성, 격리성, 지속성 = ACID가 지켜져야 함.
- ex) 입출금 시스템
'CS > Database' 카테고리의 다른 글
[Database] 관계형 데이터베이스의 이상 현상과 정규화 (0) | 2021.12.17 |
---|---|
[Database] Database, DBMS, RDB, NoSQL (0) | 2021.12.15 |
[DB/Oracle] 02. 의사컬럼 (0) | 2021.08.28 |
[DB/Oracle] 01. SELECT문 (0) | 2021.08.28 |
[Oracle/sql] 프로그래머스 sql문제 정리 (0) | 2021.08.04 |