트랜잭션

문딤·2022년 10월 10일
0

트랜잭션

트랜잭션이란?


트랜잭션은 데이터베이스의 상태를 변화시키기 위한 작업 수행의 논리적 단위를 의미한다.

❓DML을 통한 작업이 수행될때 작업이 일괄적으로 완료되면 좋겠지만,
만약 작업중 오류 발생으로 인해 도중에 DB의 데이터가 수정되거나 손상이 있다면?

A가 돈을 10000원 송금하면 A의 돈 데이터에서 10000원이 차감될 것이다. 그에 맞춰서 B의 잔고는 10000원이 추가 될 것이다. 만약 A의 로직에서 오류가 발생해 트랜젝션 rollback이 일어난다면 A의 돈 데이터는 다시 10000원이 추가됨으로써 원상복구가 될 것이다. 그치만 B의 돈은 어떠한가? 다른 트랜젝션으로 분류되었기에 아무런 rollback도 일어나지 않기 때문에 돈이 추가된 상태로 남게 된다.

⬜ DBMS의 성능은 초당 트랜잭션의 실행 수( TPS : Transaction per second )로 측정한다.

트랜잭션의 특징

원자성 (Atomicity)

원자성은 트랜잭션이 DB에 모두 반영되거나, 전혀 반영되지 않거나를 뜻한다.
All or Nothing을 생각하면 된다.

만약 트랜잭션 단위로 데이터가 처리되지 않는다면, 설계한 사람은 데이터 처리 시스템을 이해하기 힘들 뿐만 아니라, 오작동 했을시 원인을 찾기가 매우 힘들어질것이다.

독립성(Isolation)

각각의 트랜젝션은 서로 간섭 없이 독립적으로 수행되어야 한다.

트랜젝션은 기본적으로 원자성, 일관성 그리고 지속성을 보장해준다. 하지만 격리성의 경우에는 완전히 보장하려면 각각의 트랜젝션을 순서대로 처리해야한다.

이는 동시성 처리 성능을 매우 나쁘게 한다. 따라서 격리성의 수준을 여러 단계로 나눠놓았다.

◻ READ UNCOMMITED
상대방에 커밋하지 않은 데이터를 읽을 수 있다. 예를 들어 사용자 A가 트랜젝션 내에서 데이터를 수정하고 있는데 사용자 B가 그 데이터를 조회할 수 있다. 커밋되지 않은 데이터를 조회하는걸 Dirty Read라고 말한다. 사용자 B가 데이터를 사용하는 도중에 사용자A가 데이터를 롤백시켜 버리면 데이터 정합성이 깨질 수 있다.

◻ READ COMMITED
상대방이 커밋한 데이터만 조회할 수 있다. 따라서 Dirty Read는 발생하지 않는다. 하지만 NON-REPEATABLE READ가 발생할 수 있다. 예를 들어 사용자A가 커밋한 데이터를 사용자B가 트랜젝션 내에서 조회하고 있는데 이후에 사용자 A가 데이터를 수정 후 다시 커밋한다면 사용자B는 같은 트랜젝션 내에서 다른 데이터를 조회하게 되는 것이다.

◻ REPEATABLE READ
한번 조회한 데이터는 트랜젝션 내에서 다시 조회해도 같은 데이터가 나오는게 보장된다. 하지만 PHANTOM READ가 발생할 수 있다. 예를 들어 사용자A가 트랜젝션 내에서 20살 이하의 회원 리스트를 조회했을때, 중간에 사용자B가 회원을 20살 이하 회원을 한명 추가한다면, 다시 리스트를 조회했을때 나오는 결과가 달라질 수 있다. 이처럼 결과 집합이 달라지는 것을 PHANTOM READ라고 한다.

◻ SERIALABLE
가장 엄격한 수준의 격리성이지만 동시성 처리에는 매우 약하다.

데이터베이스들은 보통 동시성 처리가 중요하기 때문에 READ COMMITED 수준의 격리성을 사용한다.

지속성 (Durability)

독립성은 하나의 트랜잭션은 다른 트랜잭션에 끼어들 수 없고 마찬가지로 독립적임을 의미한다.
즉, 각각의 트랜잭션은 독립적이라 서로 간섭이 불가능하다.

일관성(Consistency)

지속성은 트랜잭션이 성공적으로 완료되면 영구적으로 결과에 반영되어야 함을 뜻한다.
보통 commit 이 된다면 지속성은 만족할 수 있다.

트랜잭션의 commit, rollback

◻ Commit
하나의 트랜잭션이 성공적으로 끝나서 데이터베이스가 일관성있는 상태에 있음을 의미한다.

◻ Rollback
트랜잭션의 원자성이 깨질 때, 즉 하나의 트랜잭션 처리가 비정상적으로 종료 되었을 때의 상태를 뜻한다.
Rollback 이 이뤄진다면 트랜잭션을 다시 실행하거나 부분적으로 변경된 결과를 취소할 수 있다.

+@ 트랜잭션의 상태

◻ Active
트랜잭션이 현재 실행 중인 상태
◻ Failed
트랜잭이 실행되다 오류가 발생해서 중단된 상태
◻ Aborted
트랜잭션이 비정상 종료되어 Rollback 이 수행된 상태
◻ Partially Committed
트랜잭션의 연산이 마지막까지 실행되고 Commit이 되기 직전 상태
◻ Committed
트랜잭션이 성공적으로 종료되어 Commit 연산을 실행한 후의 상태

참고

https://wonit.tistory.com/462

https://devjem.tistory.com/27

profile
풀스택개발자가 될래요

0개의 댓글