본문 바로가기
CS

[DB] 트랜잭션 질문 및 응답

by onejunu 2022. 6. 8.

질의응답 형식으로 면접하듯이 정리해봤습니다.

아무리 잘 아는 질문이라고 해도 막상 대답하려고 하면 어려운거 같습니다.

완벽히 아는게 아니라는걸 알려주는거 같기도합니다.

스스로 질문해보고 응답해보면 기억에 잘 남는거 같습니다.

 


RDBMS에서 트랜잭션이 무엇인가요?

- 데이터베이스에서 수행되는 작업의 최소단위입니다. 

- 데이터베이스의 무결성을 유지하면서 데이터베이스의 상태를 변화시키는 작업을 수행합니다.

- 데이터베이스는 하나 이상의 쿼리를 포함하고 있으며 ACID 규칙을 만족합니다.

 

예를 들어, 돈을 만원 출금하고 2만원 입금하는 작업 한 개의 단위가 있다고 가정해봅니다. 작업 하나를 완벽하게 끝냈다면 원래 금액에서 총 만원이 더 있어야합니다. (만원 출금하고 2만원을 입금했기 때문에) 하지만 돈을 출금을 하고 입금을 하는 과정에서 오류가 발생하여 작업이 중단 되었다고 해봅시다. 사용자 입장에서는 분명히 만원이 더 추가되었어야 하는데 오히려 만원이 더 적어지는 사태가 발생합니다. 이처럼 트랜잭션은 위와 같은 상황이 일어나지 않도록 작업의 단위에 대해서 완전히 실행되던지 아니면 실행되지 않도록 보장해주는 역할을 담당합니다.

 

또한 트랜잭션을 쓰는 이유는 데이터를 다룰 때 장애가 일어난 경우 복구하는 작업의 단위이며 여러 작업이 같은 데이터를 동시에 접근했을 때 오류가 나지 않도록 작업을 분리하기 위해 트랜잭션이 이용됩니다. 즉, 데이터의 무결성을 위한 모든 작업에 트랜잭션이 이용됩니다.

 

ACID가 무엇인가요?

원자성(Atomicity) - 하나의 트랜잭션이 완전히 실행되거나 아예 실행되지 않는 특성을 말합니다.

일관성(Consistency) - 트랜잭션이 데이터를 변경할때 미리 정의되고 예측가능한 것만 사용합니다. 예를 들어 갑자기 데이터 타입이 변경된다면 일관성이 없는 것입니다.

격리(Isolation) - 여러 트랜잭션들은 각각의 트랜잭션에 끼어들 수 없는 특성입니다.

영속성(Durability) - 트랜잭션 실행을 통해 데이터의 변경사항은 영원히 반영됩니다. 디스크에 올리는 것도 포함입니다.

 

 

트랜잭션에서 동시성제어가 필요한가요?

- 락을 통해 갱신손실을 막아야합니다.

- 갱신손실이란 다음과 같습니다.

1) 트랜잭션 1과 2에서 Money에 해당하는 값인 1000을 읽습니다.

2) 트랜잭션 1에서 100을 더합니다.

3) 트랜잭션 2에서 100을 뺍니다.

4) 트랜잭션 2에서 900을 WRITE 합니다.

5) 트랜잭션 1에서 1100을 WRITE 합니다.

 

원래는 기대값이 1000이 되어야합니다. 하지만 트랜잭션2가 무시된것 처럼 작업이 일어났습니다. 이를 갱신손실이라고 합니다.

이를 락을 통해서 해결해보겠습니다.

 

 

1) 트랜잭션 1에서 Money을 읽기 위해 LOCK을 얻고 다른 트랜잭션의 접근을 막습니다.

2) 트랜잭션 2에서는 접근하지 못해 대기합니다.

3) 트랜잭션 1에서 1100을 WRITE 한 후 LOCK을 반환합니다.

4) 트랜잭션 2에서 LOCK을 얻어 1100을 읽어 온후 100을 뺀 1000을 WRITE 합니다.

 

이 처럼 2개의 트랜잭션을 통해서 간단하게 설명했지만 실제론 락을 어디까지 거는지 얼마나 거는지 등 복잡하지만 큰 맥락은 같습니다.

 

LOCK의 부작용이 있을까요?

- LOCK의 제어를 잘 못하면 데드락이 걸릴 수 있습니다.

 

1) 트랜잭션 1이 A 를 읽기 위해 LOCK을 검

2) 트랜잭션 2가 B를 읽기 위해 LOCK을 검

3) 트랜잭션 1이 B를 읽어 오려고 했으나 LOCK이 걸려 대기

4) 트랜잭션 2가 A를 읽어 오려고 했으나 LOCK이 걸려 대기

 

데드락은 어떻게 피하나요?

- 트랜잭션에 들어가기전에 사용하는 모든 테이블에 LOCK을 거는 방법이 있습니다. 이렇게 되면 트랜잭션의 병행성이 보장되지 않습니다. 

- 타임스탬프를 이용해 롤백을 하며 데드락을 피하는 방법이 있는데 궁금하시면 찾아보시기 바랍니다.

댓글