공부/인프런 - Rookiss

Part 5-4-4. 부록 : 트랜잭션

셩잇님 2024. 7. 22. 18:15
반응형

 

 

🌚 부록

 

 지난 시간에는 대기와 락에 대해서 알아보았다. 데이터베이스 또한 여타 다른 프로그램과 다를 바 없이 멀티쓰레드를 사용하고 비행기 화장실로 비유한 락을 통해 처리하는 것 까지 알아보았다. 이 후 락을 어디다가 걸어줘야 하는가?에 대해서 알아보고, 이에 따라 락을 걸 때에도 아무렇게나 락을 걸어주는 것이 아닌 보다 현명하게 걸어야하는 것 까지 알 수 있었다. 오늘은 트랜잭션에 대해서 알아볼 것이며 마찬가지로 이론을 통해 트랜잭션을 알아보도록 하자.

 


 

👩‍🦱 트랜잭션

 

 트랜잭션의 개념은 이전 시간에 학습했으므로 아래 링크로 대신한다.

 

https://shung2.tistory.com/1485

 

Part 5-2-17. SQL 입문 : TRANSACTION, COMMIT/ROLLBACK

💅 SQL 입문  지난 시간에는 JOIN을 통해 복수의 테이블에서 공통 열을 통해 테이블 정보를 살펴보는 내용에 대해서 알아보았다. 이번 시간에서는 TRANSACTION과 COMMIT, ROLLBACK 등 개념을 통해 테이터

shung2.tistory.com

 

 다만 위 링크에서는 트랜잭션의 개념만 알아보았지, 딱히 특성을 알아보지는 않았다. 오늘은 조금 더 자세하게 트랜잭션의 특성까지 알아보도록 하자.

 

트랜잭션의 ACID 특성

 

 트랜잭션은 'ACID'라는 특성이 있는데 이는 각각의 단어의 약자로 구성되어 있다. 살펴보면 원자성, 일관성, 고립성, 지속성을 의미한다. 그 중에서도 데이터베이스에서는 1번과 4번인 원자성과 지속성을 유의깊게 살펴봐야 한다.

 

원자성과 지속성

 

 원자성을 예로 들면 플레이어가 물약을 산다고 할 경우, 1) 골드를 감소시키고 2) 물약을 인벤토리에 추가한다. 와 같이 2단계로 행위가 나뉘어진다. 근데 골드는 감소가 되었으나 물약이 인벤토리에 추가되지 않을 경우 All or Noting에 위반되어 원자성 특성에 위반되는 것이다. 그리고 지속성은 장애가 발생하더라도 데이터는 반드시 복구가 되는 것을 뜻한다.

 

 그렇다면 1번과 4번을 어떻게 동시에 만족시키며 처리해야 할까? 예를 들어보자. 만약 골드 감소까지 처리했는데 알수없는 문제로 인해 물약이 인벤토리에 추가되지 않을 경우 이를 어떻게 확인해서 처리해야 할까? 애시당초 골드는 감소했는가? 안했는가? 이것도 알 수 없다면 어떻게 해야할까?

 

로그를 남긴다.

 

 결론부터 얘기하자면 데이터베이스는 항상 무엇인가를 할 때 로그를 남긴다. 따라서 위 이미지와 같이 골드를 감소시키고, 물약을 얻을 경우의 로그 또한 남겨지게 된다. 로그는 크게 2가지로 구분할 수 있는데

1) 현재 상태에서 미래로 가기 위한 로그(=리두(Redo))와

2) 어떤 작업을 했을 때 과거로 돌아하기 위한 로그(=언두(Undo))로 나뉘어져 있다.

 따라서 이 두가지의 상태는 항상 기본적으로 처리한다.

 

 

 로그를 통해 데이터베이스는 플레이어의 골드를 줄이고, 물약을 늘려주는 작업을 메모리에 남겨두었다가 백그라운드 작업을 처리하는 친구가 이를 하드에 들고가 보관한다. 따라서 이 떄 알수없는 이유로 물약의 개수가 증가하지 않았다면 데이터베이스가 하드에 보관한 로그를 보며 '음.. 어디까지 작업을 했구나'를 확인하고 미래로 가서 물약의 개수를 4개로 늘려주거나 혹은 롤백을 통해 골드를 30으로 늘려주도록 처리한다.

 


 

👩‍🦱 오늘의 결론

 

 특정 쿼리문을 커밋한다고해서 바로 반영되는 것은 아니고 '로그'를 통해 이를 관리한다. 로그는 Redo 로그와 Undo 로그가 있으며 해당 로그를 통해 데이터베이스는 원자성을 계속 관리해준다.

 

 

반응형