[Node.js_4기] Today_I_Learn : 트랜잭션 (24/01/30)

2024. 1. 30. 23:10공부/내배캠 TIL

목차

 

1. 학습 내용

2. 내용 정리

 

 

1. 학습 내용 

 

 - 학습 목표 - 

1. 트랜잭션(Transaction)의 개념에 대해 알아봅니다.

2. 트랜잭션의 특징 (ACID)에 대해 알아봅니다.

 

2. 내용 정리 

 

1. 트랜잭션의 개념

1) 트랜잭션이란 무엇인가.

데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용의 단위이다.(by.wiki)

데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위.

트랜잭션(Transaction)은 작업의 완전성을 보장하기 위해 사용되는 개념.

(작업 단위를 하나의 쿼리에 종속하는 것이 아닌, 여러 쿼리를 묶어 하나의 작업단위로 처리하는 작업을 뜻한다.)

 

2) 트랜잭션을 사용해야 하는 이유

트랜잭션은 부분 업데이트같은 상황을 방지하기 위해 도입되었다.

(ex : A에서 B로 계좌이체시 A계좌에서 차감과 B계좌에서 증가가 동시에 일어나야 하지만, 1번 작업 수행 후 2번 작업 실행중 오류 발생시 A계좌에서 차감만 이뤄지는 문제)

 

-> 트랜잭션 설계를 잘 하는 것이 데이터베이스를 다룰때 강점으로 작용한다.

 

2. 트랜잭션의 특징

ACID는 데이터베이스 트랜잭션이 안전하게 수행됨을 보장하기 위한 특징들을 나열한것.

 

1) 원자성(Atomicity)

원자성은 트랜잭션 내의 명령들은 하나의 묶음으로 처리하여, 전부 성공하거나 전부 실패해야한다는 특징이다.

쿼리 하나를 작업단위로 보지 않고, 여러 작업들을 묶은 트랜잭션을 하나의 작업단위로 본다.

(계좌 금액 차감과 금액 증가를 두 쿼리로 보는게 아닌, 계좌이체라는 하나의 트랜잭션으로 묶어서 관리한다.)

 

2) 일관성(Consistency)

트랜잭션 내부에서 처리되는 데이터의 일관성이 유지되어야 한다는 특징.

작업이 성공할 경우 아무런 문제가 발생하지 않고, 실패하더라도 작업 진행 도중 실패한 상태로 데이터를 방치하지 않는다.

즉, 에러가 발생하더라도 데이터가 파손되지 않는다는 뜻이다. 

- 첫번째 작업이 성공하지만 두번째 작업이 실패한다면, 트랜잭션 롤백(Transaction Rollback)이 실행되어 테이블이 트랜잭션 시작 전 상태로 복구된다.

 

3) 격리성(Isolation)

트랜잭션이 실행 중인 경우, 다른 트랜잭션에 의해 데이터가 변경되는 것을 방지하는 특징.

트랜잭션이 완전히 수행되거나 수행되지 않은 상태를 외부에서 참조할 수는 있지만, 중간 과정이나 중간 결과를 볼 수 없도록 한다. (격리성의 경우, 사용중인 DB오브젝트에 락을 걸어 격리성을 구현한다.)

3_1) 동시성(Concurrency)

여러 클라이언트가 동시에 하나의 데이터를 사용 및 공유하는 것.

다수의 사용자가 동일한 시스템을 공유하면서 발생하는 동시접근 문제를 발생. (Lock 개념의 발생)

더보기
  1. 1️⃣  트랜잭션에서 A 계좌에서 천원을 차감하여 10,000 → 9,000으로 수정하였습니다.
  2. 2️⃣  트랜잭션에서 아직 커밋 되지 않은 1️⃣ 트랜잭션의 데이터를 바탕으로 A 계좌에서 천원을 차감하여 9,000 → 8,000으로 수정하였습니다.
  3. 1️⃣  트랜잭션에서 에러가 발생하여, 트랜잭션을 ROLLBACK하게 되었습니다. ㄷ따라서, A 계좌의 잔고는 원래대로 10,000이 되었습니다.
  4. 그런데 2️⃣  트랜잭션에서 잘못된 데이터를 바탕으로 작업을 수행한 후 트랜잭션을 COMMIT 하게 되었습니다. 그로인해 A 계좌의 잔고가 8,000으로 잘못 표시되는 문제가 발생하였습니다.

 

동시에 여러 트랜잭션이 동일 데이터에 접그시 데이터의 일관성을 유지하기 어려울 수 있다.

이를 해결하기 위해, 자원을 사용하는 클라이언트만 해당 자원을 점유할 수 있도록 하여 자원을 공유하는 원인을 제거하면 된다.

3_2) 락(Lock)

동시성을 제어하기 위해 트랜잭션이 사용 중인 데이터를 잠그는 것.

다른 트랜잭션들이 그 데이터에 접근하지 못하게 하여 데이터 일관성을 유지할 수 있게 한다.

 

- 락의 종류 -

공유 락(Shared Locks) | 읽기 락(READ Locks)

다른 트랜잭션이 데이터를 읽기는 가능하지만, 수정하는 것은 금지.

 

배타 락(Exclusive Locks | 쓰기 락(WRITE Lock)

다른 트랜잭션이 데이터를 읽거나, 수정하는 것을 금지한다. (점유하고 접근할 수 없게 만든다.)

 

- 락킹 수준 - 

글로벌 락(Global Locks) | 데이터베이스 락(Database Locks)

모든 테이블에 락을 걸어, 현재 트랜잭션을 제외한 나머지 트랜잭션들이 모든 테이블을 사용할 수 없도록 한다.

가장 높은 수준의 락을 가지고 있으며, 가장 큰 범위 수준.

 

테이블 락(Table Locks)

다른 사용자가 작업중인 테이블을 동시에 수정하지 못하도록 한다.

 

네임드 락(Named Locks)

테이블이나 테이블의 행과같은 DB 오브젝트가 아닌, 특정한 문자열을 점유한다.

 

메타데이터 락(Metadata Locks)

다른 사용자가 작업중인 테이블의 동일한 행 및 동일한 데이터베이스의 객체를 동시에 수정하지 못하도록 한다.

 

4) 지속성(Durability)

트랜잭션이 성공적으로 커밋된 후, 해당 트랜잭션에 의해 생성/수정된 데이터가 어떤 상황에서도 보존되는 특징.

트랜잭션이 Commit된 결과는 DB에 영구적으로 저장된다. 

(트랜잭션 수행중 비정상 종료 발생시, 시스템은 트랜잭션 로그를 통해 커밋되지 않은 트랜잭션 복구 가능)

 

5) 격리 수준(Isolation Level)

여러 트랜잭션이 동시 처리될 때, 다른 트랜잭션에서 변경 및 조회하는 데이터를 읽을 수 있도록 허용/거부 하는 것을 결정하기 위해 사용하는 개념. 데이터 일관성과 동시성 처리 성능 사이에서 균형을 잡아야 한다.

 

READ UNCOMMITTED

커밋 되지 않은 읽기(Uncommitted Read)를 허용하는 격리 수준.

(커밋 되지 않은 읽기 : 다른 트랜잭션에 의해 작업중인 데이터가 읽혀짐. 의도치 않게 데이터를 참조하게 되어 일관성이 깨질 수 있다.)

가장 낮은 수준의 격리수준이며, 락을 걸지 않아 동시성이 높지만 일관성이 쉽게 깨질 수 있다.

 

READ COMMITTED

커밋 된 읽기(Committed Read)만을 허용하고, SELECT 문을 실행할 때 공유락을 건다.

다른 트랜잭션이 데이터를 수정하고 있는 중에는 데이터를 읽을 수 없어 커밋되지 않은 읽기현상이 발생하지 안음.

 

REPEATABLE READ

읽기를 마치더라도 공유락을 풀지 않으며, 트랜잭션이 완전히 종료될 때 까지 락을 유지.

공유락이 걸린 상태에서 데이터를 수정하는 것은 불가능하지만, 데이터를 삽입하는 것이 가능. 그로인해 팬텀 읽기가 발생할 수 있는 문제점 존재.

(팬텀 읽기 : 트랜잭션 수행중 다른 트랜잭션에 의해 삭제된 데이터를 읽어버리는 현상.)

 

SERIALIZABLE

데이터를 읽는 동안 다른 트랜잭션이 해당 데이터를 읽거나 삽입할 수 없고, 새로운 데이터를 추가하는 것 또한 불가능.

가장 높은 수준의 격리 수준이므로, 동시성이 떨어지는 문제점이 존재.

 

 

 

 

 

이번 TIL은 굉장히 대충 쓴 느낌이 난다.

잘 이해도 되지 않고, 굉장히 많은 단어들이 나와 혼란스럽기 때문이다.

그래도, 정리한 내용을 다시 읽어보고, 익숙해지도록 노력하자.