mojo's Blog

Transaction 본문

Computer Science/데이터베이스

Transaction

_mojo_ 2022. 2. 28. 22:40

※ Transaction 

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

 

어떠한 데이터베이스의 상태를 변화시키는지 ?

 

상태를 변화시킨다는 것은 SQL 질의어를 통해 DB 에 접근하는 것을 의미한다.

이때 SQL 질의어로 SELECT, INSERT, DELETE, 그리고 UPDATE 총 4개로 구성된다.

 

어떠한 작업 단위를 수행하는지 ?

 

많은 SQL 명령문들을 사람이 정하는 기준에 따라 정하는 것을 수행한다.

 

예를 들어 생각해보도록 한다.

사용자 A가 사용자 B에게 100 만원을 보낸다고 가정해본다.

이때 다음과 같이 DB 작업을 수행하도록 정한다.

 

  1. 사용자 A의 계좌에서 100 만원을 차감한다. => UPDATE 문을 통한 사용자 A의 잔고 변경
  2. 사용자 B의 계좌에서 100 만원을 추가한다. => UPDATE 문을 통한 사용자 B의 잔고 변경

 

현재 작업 단위는 출금 UPDATE 문과 입금 UPDATE 문으로 구성된다.

이를 통합하여 하나의 트랜잭션(transaction) 이라고 한다.

두 쿼리(1, 2)가 모두 성공적으로 완료되어야만 "하나의 작업(transaction)"이 완료되는 것이다. (commit)

 

Commit 이란 ?

 

하나의 작업(transaction)이 성공적으로 끝났고, DB가 일관성있는 상태일 때 이를 알려주기 위해 사용하는 연산을 의미한다.

 

그리고 작업 단위에 속하는 쿼리 중 하나라도 실패하게 된다면, 모든 쿼리를 취소하고 이전 상태로 되돌려야 한다. (rollback)

 

Rollback 이란 ?

 

하나의 작업(transaction) 처리가 비정상적으로 종료되어 작업 원자성이 깨진 경우, transaction 이 정상적으로 종료되지 않았을 때, last consistent state(transaction 의 시작 상태)로 roll back 할 수 있다.

 

즉, transaction 설계를 잘하는 것이 데이터를 다룰 때 많은 이점을 가져다준다.

 

 

transaction 특징 (ACID)

 

  • Atomicity : transaction이 DB에 모두 반영되거나 혹은 전혀 반영되지 않아야 한다.
  • Consistency : transaction 의 작업 처리 결과는 항상 일관성 있어야 한다.
  • Isolation : 두개 이상의 transaction이 동시에 병행 실행되고 있을 때, 어떤 transaction 도 다른 transaction 연산에 끼어들 수 없다.
  • Durability : transaction 이 성공적으로 완료되었다면 결과는 영구적으로 반영되어야 한다.

 

 

※ Transaction 관리를 위한 DBMS의 전략

 

① DBMS 구조

크게 2가지로 Query Processor, Storage System 이 나뉜다.

 

② Page Buffer Manager or Buffer Manager

DBMS의 Storage System 에 속하는 모듈 중 하나로, Main Memory에 유지하는 페이지를 관리하는 모듈을 말한다.

Buffer 관리 정책에 따라 UNDO 복구와 REDO 복구가 요구되거나 그렇지 않게 되므로 transaction 관리에 매우 중요한 결정을 가져온다.

 

③ UNDO

UNDO 가 필요한 이유는 수정된 Page 들이 Buffer 교체 알고리즘에 따라서 디스크에 출력될 수 있다.

Buffer 교체는 transaction 과는 무관하게 buffer 의 상태에 따라서 결정된다.

따라서 정상적으로 종료되지 않은 transaction 이 변경한 page 들은 원상 복구 되어야 하는데, 이 복구를 undo 라고 한다.

 

④ REDO

이미 commit 한 transcation 의 수정을 재반영하는 복구 작업을 의미한다.

Buffer 관리 정책에 영향을 받으며 transaction 이 종료되는 시점에 해당 transaction 이 수정한 page를 디스크에 쓸 것인가 아닌가로 기준을 정한다.

 


 

※ Transaction Isolation Level

트랜잭션에서 일관성 없는 데이터를 허용하도록 하는 수준을 의미한다.

 

Isolation level 이 필요한 이유 ?

 

데이터베이스는 ACID 특징와 같이 트랜잭션이 독립적인 수행을 하도록 한다.

따라서 Locking 을 함으로써 트랜잭션이 DB를 다루는 동안 다른 트랜잭션이 관여하지 못하도록 막는 것이 필요하다.

하지만 무조건 Locking 으로 동시에 수행되는 수많은 트랜잭션들을 순서대로 처리하는 방식으로 구현하게 되면 데이터베이스의 성능은 떨어지게 된다.

그렇다고 해서 성능을 높이기 위해 Locking 범위를 줄이게 된다면 잘못된 값이 처리될 문제가 발생하게 된다.

따라서 최대한 효율적인 Locking 방법이 필요하다.

 

 

Isolation level 종류

① Read Uncommitted (level 0)

SELECT 문장이 수행되는 동안, 해당 데이터에 Shared Lock 이 걸리지 않는 계층이다.

트랜잭션에 처리중이거나 아직 commit 되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용한다.

예를 들어 사용자1이 A라는 데이터를 B라는 데이터로 변경하는 동안 사용자2는 아직 완료되지 않은(Uncommitted) 트랜잭션이지만 데이터B를 읽을 수 있다.

따라서, 데이터베이스의 일관성을 유지하는 것이 불가능하다.

 

② Read Committed (level 1)

SELECT 문장이 수행되는 동안, 해당 데이터에 Shared Lock 이 걸리는 계층이다.

트랜잭션이 수행되는 동안 다른 트랜잭션이 접근할 수 없으므로 대기하게 된다.

commit 이 이루어진 트랜잭션만 조회가 가능하다.

SQL 서버가 Default 로 사용하는 Isolation level 이라고 한다.

예를 들어 사용자1이 A라는 데이터를 B라는 데이터로 변경하는 동안 사용자2는 해당 데이터에 접근이 불가능하다.

 

③ Repeatable Read (level 2)

트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸리는 계층이다.

트랜잭션이 범위 내에서 조회한 데이터 내용이 항상 동일함을 보장한다.

다른 사용자는 트랜잭션 영역에 해당되는 데이터에 대한 수정이 불가능하다.

 

④ Serializable (level 3)

트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸리는 계층이다.

완벽한 읽기 일관성 모드를 제공하며 다른 사용자는 트랜잭션 영역에 해당하는 데이터에 대한 수정 및 입력이 불가능하다.

 

 

★ Isolation Level 선택 시 고려사항

Isolation Level 에 대한 조정은 동시성, 그리고 데이터 무결성에 연관되어 있다.

동시성을 증가시키면 데이터 무결성에 문제가 발생하며, 데이터 무결성을 유지하면 동시성이 떨어지게 된다.

레벨을 높게 조정할수록 발생하는 cost 가 증가한다.

 

 

♣ 낮은 단계의 Isolation Level 을 활용할 때 발생하는 현상들

  • Dirty Read : commit 되지 않은 수정중인 데이터를 다른 트랜잭션에서 읽을 수 있도록 허용할 때 발생하는 현상으로, 어떤 트랜잭션에서 아직 실행이 끝나지 않은 다른 트랜잭션에 의한 변경사항을 보게되는 경우가 발생한다.
  • Non-Repeatable Read : 한 트랜잭션에서 같은 쿼리를 두 번 수행할 때, 그 사이에 다른 트랜잭션 값을 수정 또는 삭제하면서 두 쿼리의 결과가 상이하게 나타나는 일관성이 깨진 현상을 말한다.
  • Phantom(환상) Read : 한 트랜잭션 안에서 일정 범위의 레코드를 두 번 이상 읽었을 때, 첫번째 쿼리에서 없던 레코드가 두번째 쿼리에서 나타나는 현상을 말한다. (트랜잭션 도중 새로운 레코드 삽입을 허용하기 때문에 나타나는 현상)

 

참고 : gyoogle/tech-interview-for-developer: 👶🏻 신입 개발자 전공 지식 & 기술 면접 백과사전 📖 (github.com)

 

GitHub - gyoogle/tech-interview-for-developer: 👶🏻 신입 개발자 전공 지식 & 기술 면접 백과사전 📖

👶🏻 신입 개발자 전공 지식 & 기술 면접 백과사전 📖. Contribute to gyoogle/tech-interview-for-developer development by creating an account on GitHub.

github.com

 

'Computer Science > 데이터베이스' 카테고리의 다른 글

Anomaly, Index  (0) 2022.03.02
데이터베이스  (0) 2022.03.02
Redis  (0) 2022.03.01
Normalization  (0) 2022.01.21
SQL injection / SQL vs NoSQL  (0) 2022.01.20
Comments