트랜잭션의 특징(ACID)와 격리성 문제 3대장

allnight5·2022년 12월 27일
0

기술공부

목록 보기
27/33

트랜잭션이란 데이터베이스 관리 시스템(DBMS)에서 하나의 논리적인 작업 단위를 의미합니다.
"DB 데이터에 변화를 일으키는" 더이상 작게 나눌 수 없는 작업 단위를 의미한다. 그 작업들이 하나로 연결되어 있는 경우도 트랜잭션이라고 한다.

트랜잭션의 4가지 특징(ACID)


1.원자성(Atomicity)
- 트랜잭션은 더 이상 분해가 불가능한 업무의 최소단위이므로, 전부 처리되거나 아예 하나도 처리되지 않아야 한다.
2.일관성(Consistency)
- 일관된 상태의 데이터베이스에서 하나의 트랜잭션을 성공적으로 완료하고 나면 그 데이터베이스는 여전히 일관된 상태여야 한다.
즉, 트랜잭션 실행의 결과로 데이터베이스 상태가 모순되지 않아야 한다.
- 트랜잭션이 일어난 이후의 해당 데이터베이스의 제약이나 규칙을 여전히 만족하고 있어야한다는 것이다.
- 계좌는 항상 양수여야한다는 제약이 있었는데 송금이후 계좌의 잔액이 마이너스가 된다면 일관성이 유지 되지 않는것이다.
3.격리성(Isolation)
- 실행 중인 트랜잭션의 중간결과를 다른 트랜잭션이 접근할 수 없다.
-동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리 해야한다
4.영속성(Durability)
- 트랜잭션이 일단 그 실행을 성공적으로 완료하면 그 결과는 데이터베이스에 영속적으로 저장된다.(트랜잭션을 성공적으로 마치면 그 결과가 항상 저장되어야 한다.)

3. 격리성으로 인해 나타날 수 있는 문제점


격리성으로 인해 나타날 수 있는 문제점은 일반적으로 Dirty Read, Non-Repeatable Read, Phantom Read 3가지라고 합니다.

dirty Read

Dirty Read는 다른 트랜잭션에 의해 수정됐지만 아직 커밋되지 않은 데이터를 읽는 것 실행하다가 중간에 롤백된것을 읽어오는것
예시

한 트랜잭션(T1)이 데이타에 접근하여 값을 'A'에서 'B'로 변경했고 아직 커밋을 하지 않았을때, 다른 트랜잭션(T2)이 해당 데이타를 Read 하면?
T2가 읽은 데이타는 B가 될 것이다. 하지만 T1이 최종 커밋을 하지 않고 종료된다면, T2가 가진 데이타는 꼬이게 된다.

Non-Repeatable Read

한 트랜잭션(T1)이 데이타를 Read 하고 있다. 이때 다른 트랜잭션(T2)가 트랜잭션(T1)이 Read하기 전에 데이타에 접근하여 값을 변경 또는, 데이타를 삭제하고 트랜잭션을 완료하게 된다면?
그 후 T1이 다시 해당 데이타를 Read하고자 하면 변경된 데이타 혹은 사라진 데이타를 찾게 된다.

Phantom Read

트랜잭션(T1) 중에 특정 조건으로 데이타를 검색하여 결과를 얻었다. 이때 다른 트랜잭션(T2)가 접근해 해당 조건의 데이타 일부를 삭제 또는 추가 했을때, 아직 끝나지 않은 T1이 다시 한번 해당 조건으로 데이타를 조회 하면 T2에서 추가/삭제된 데이타가 함께 조회/누락 된다. 그리고 T2가 롤백을 하면? 데이타가 꼬인다

트랜잭션 격리수준

이러한 문제점을 해결하기 위해서 격리성의 수준을 지정할수 있게하였는데
등급이 높아질수록 동시처리 성능이 급격히 떨어지는 단점이 있다.
(1) Read Uncommitted
한 트랜잭션에서 커밋하지 않은 데이타에 다른 트랜잭션이 접근 가능하다. 즉, 커밋하지 않은 데이타를 읽을 수 있다.
이 수준은 당연히 위에서 언급한 모든 문제에 대해 발생가능성이 존재한다. 대신, 동시 처리 성능은 가장 높다.
발생 문제점 : Dirty Read, Non-Repeatable Read, Phantom Read

(2) Read Committed
커밋이 완료된 데이타만 읽을 수 있다.
Dirty Read가 발생할 여지는 없으나, Read Uncommitted 수준보다 동시 처리 성능은 떨어진다. 대신 Non-Repeatable Read 및 Phantom Read는 발생 가능하다.데이타베이스들은 보통 Read Committed를 디폴트 수준으로 지정한다.
발생 문제점 : Non-Repeatable Read, Phantom Read

(3) Repeatable Read
트랜잭션 내에서 한번 조회한 데이타를 반복해서 조회해도 같은 데이타가 조회 된다 조회 방법으로는 앞서 발생한 트랜잭션에 대해서는 실제 데이터가 아닌 Undo 로그에 있는 백업데이터를 읽게 합니다.
이는 개별 데이타 이슈인 Dirty Read나 Non-Repeatable Read는 발생하지 않지만, 결과 집합 자체가 달라지는 Phantom Read는 발생가능하다.
발생 문제점 : Phantom Read

(4) Serializable
트랜잭션 내에서 쿼리를 두 번 이상 수행할 때, 첫 번째 쿼리에 있던 레코드가 사라지거나 값이 바뀌지 않음은 물론 새로운 레코드가 나타나지도 않도록 하는 설정입니다.
위 3가지 문제점을 모두 커버 가능하다. 하지만 동시 처리 성능은 급격히 떨어질 수 있다.

profile
공부기록하기

0개의 댓글