Post
EN

Transaction , isolation level

Trans + action

​

원자성(Atomicity)

완전하게 수행 완료되지 않으면 전혀 수행되지 않아야 한다.

연산은 Commit, Rollback을 이용해 적용 또는 취소로 한꺼번에 완료되어야 한다.

중간 하나의 오류가 발생되더라도 취소가 되어야 한다.

​

일관성 (Consistency)

시스템의 고정 요소는 트랜잭션 수행 전후에 같아야 한다.

트랜잭션 결과는 일관성을 유지해야한다.

​

격리성 (Isolation)

트랙잭션 실행시 다른 트랜잭션의 간섭을 받지 않도록 하는 것.

​

영속성 (Durability)

트랜잭션의 완료 결과가 데이터베이스에 영구히 기억된다.

​

트랜잭션의 연산

Commit 연산 : 트랜잭션 실행이 성공적으로 종료되었음을 선언한다.

Rollback 연산 : 트랜잭션 실행이 실패하였음을 선언한다.

​

병행 제어 (Concurrency Control)

동시에 수행되는 트랜잭션들을 일관성 있게 처리하기 위해 제어하는 것.

​

데이터베이스의 공유를 최대화 한다.

데이터베이스의 일관성을 최대화한다.

시스템 활용도를 최대화한다.

사용자에 대한 응답 시간을 최소화한다.

​

병행 제어 기법

로킹 (Locking) : 하나의 트랜잭션이 데이터를 액세스하는 동안 다른 트랜잭션이 그 데이터 항목을 액세스 할 수 없도록 하는 병행제어 기법이다.

​

로킹의 특징

  • 로킹 단위가 커지면 로크의 수가 적어 관리가 쉬워지지만, 병행성 수준이 낮아진다.

  • 로킹 단위가 작으면 로크의 수가 많아 관리가 어려워지지만, 병행성 수준이 높아진다.

​

2단계 로킹 (2-Phase Locking)

직렬성은 보장하지만 교착상태 예방은 불가능하다.

확장 단계와 축소 단계의 두 단계(Phase)가 있다.

각 트랜잭션의 로크 요청과 해제 요청을 2단계로 실시한다.

​

타임스탬프

트랜잭션이 DBMS로부터 유일한 타임스탬프를 부여 받는다

타임스탬프가 적을수록 트랜잭션의 우선순위를 높게 하여, 타임스탬프가 적은 트랜잭션이 철회되는 방식이다.

​

​

격리 수준 (Isolation Level)

​

가장 낮은 격리 수준인 레벨 0인 경우 Lock이 걸리지 않기 때문에 속도는 빠르나 동시 접근을 허용하기 때문에 데이터 정합성에 문제가 생길 수 있다, 반대로 레벨 3의 경우 완전한 Lock이 걸리기 때문에 동시 접근을 차단하여 순차적으로 처리(Serializable)하기 때문에 정합성은 완벽하시만 동시에 처리할 수 있는 양이 적어 속도가 매우 느리다.

Isolation Level

Dirty Read

Nonrepeatable Read

Phantom Read

레벨0 Read Uncommited

발생

발생

발생

레벨1 Read Committed

X

발생

발생

레벨2 Repeatable Read

X

X

발생

레벨3 Serializable

X

X

X

동시성 이슈란 하나 이상의 트랜잭션이 동시에 동일한 데이터에 접근하여 읽기/쓰기 오퍼레이션을 할 때 발생할 수 있음으로 이 상황을 기억하고 어떤 문제가 발생할 수 있는지 아래를 살펴보자.

​

Dirty Read

  • 완료되지 않은 트랜잭션이 갱신한 내용을 읽는 것

read - read는 문제가 안생긴다.

read - write

wrtie - read

write - write 일 때 문제가 발생 됨

​

T1 = 트랜잭션 1

T2 = 트랜잭션 2

​

T1이 A테이블을 UPDATE할 때 T2에서 A테이블 내용을 SELECT하는 상황을 가정

T1

T2

UPDATE user

SET name = ‘아무개’

WHERE id = 13

SELECT name

FROM user

WHERE id = 13

Rollback;

Commit;

​

​

Non-Repeatable Read

​

T1

T2

SELECT name

FROM user

WHERE id = 13

UPDATE user

SET name = ‘홍길동’

WHERE id = 13;

COMMIT;

SELECT name

FROM user

WHERE id = 13;

COMMIT;

T2가 User id = 13에 대해 질의를 하고 트랜잭션이 완료되지 않고 나왔던 결과값이 T1에서 name이 변경되고 트랜잭션이 완료가 되면 T2가 다시 SELECT를 하게되면 이전 값을 얻을 수 없거나 또는 변경된 값을 얻게 된다.

​

Phantom Read

​

트랜잭션1이 A테이블에서 SELECT한 이후 트랜잭션2에서 A테이블에 내용을 추가/삭제 하는 상황.

트랜잭션 T1에 속한 첫번째 SELECT문과 두 번째 SELECT문의 수행 결과가 다르게 나타남. 이러한 현상을 팬텀 문제라고 함.

​

도표 입력 예정.

​

참조 : https://www.letmecompile.com/database-transaction-isolation-level/

DB 트랜잭션 격리 수준

Thread에서 공유 자원에 동시 접근을 제한하기 위해 Lock을 걸듯이 DB에서도 트랜잭션들 간에 같은 동일한 데이터에 대한 동시 접근을 제한하기 위하여 Lock을 설정할 수 있다. Lock을 건다는 것은 그만큼 동시처리량이 줄어든다는 의미이기 때문에 과도하게 사용하면 성능에 문제가 생길 수 있다. 따라서 상황별로 꼭 필요한 수준의 Lock을 걸어서…

​

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