모노산달로스의 행보

[Database] Transaction(트랜잭션)이란? 본문

Backend/Database

[Database] Transaction(트랜잭션)이란?

모노산달로스 2024. 8. 15. 12:32

Database/DBMS - Transaction

Databases are crucial for managing, securing, and scaling data efficiently

현대 사회의 모든 것은 데이터로 이루어져 있습니다. 많은 서비스가 데이터를 기반으로 동작합니다. 특히나 AI가 발전함에 따라 데이터의 중요성은 더욱 커져가고 있습니다. 즉, 데이터의 수가 크게 늘어남에 따라 이를 적절하게 관리하고 접근하는 기술은 이제 필수적입니다. 데이터베이스는 대량의 데이터를 체계적으로 저장, 관리, 검색하여 다수의 사용자가 동시에 접근하고 활용할 수 있도록 하는 시스템입니다. 앞으로 효과적으로 데이터를 관리하기 위해 이에 대한 깊은 이해가 필요합니다.

Transaction(트랜잭션)

트랜잭션은 거래라는 뜻의 명사입니다

 

데이터베이스의 데이터에 변화가 일어나는 경우, 모든 작업은 순차적으로 일어날 필요가 있습니다. 예를 들어 은행 거래를 생각해 봅시다. 한 사용자가 자신의 계좌에서 돈을 인출하려고 합니다. 그렇게 되면 다음과 같은 작업을 수행하게 됩니다.

1. 사용자의 잔금을 확인합니다.

2. 필요한 양의 금액을 제거합니다.

3. 이체받는 계좌의 금액을 갱신합니다.

 

즉, 순차적으로 데이터를 조작하기 시작합니다. 이러한 연속된 작업을 모아 트랜잭션이라고 합니다.

 

Transaction Flow

 

트랜잭션이 필요한 이유는 두 가지가 존재합니다.

 

서비스에서 시스템 오류는 피할 수 없습니다. 이러한 상황에서 트랜잭션은 안정적인 결과를 보장해 줍니다. 즉, 하나의 작업을 모두 수행하여 변화가 올바르게 반영되는 경우와 오류가 발생하여 변화를 적용하지 않는 경우만 존재하게 됩니다.

 

또한, 데이터베이스 서버에 동시적인 요청이 발생하는 경우, 같은 데이터를 동시에 변경하는 문제가 생길 수 있습니다. 트랜잭션이 이러한 충돌을 방지해줍니다.

 


DBMS에서의 Transaction(트랜잭션)

Transaction 작업의 예시

 

두 개의 세션이 존재하는 경우를 생각해 봅시다. 세션 1에서 두 개의 멤버 데이터를 추가합니다. 이후 데이터베이스를 조회하면 세션 1에서는 새롭게 추가한 멤버 데이터를 확인할 수 있습니다. 하지만 세션 2에서는 아직 멤버 데이터를 조회할 수 없습니다.

 

이러한 상황에서, 세션 1에서 Commit 명령어를 실행하면 실제로 변화가 적용됩니다. 세션 2는 이제야 변화를 확인할 수 있습니다. 만약 Rollback 명령어를 수행한다면 데이터는 기존의 상태로 돌아가게 됩니다. 즉, 변화가 적용되지 않고 세션 2는 기존의 데이터만 계속 조회하게 됩니다.

트랜잭션은 처음부터 끝까지 완전하게 실행되어야 합니다. 다시 말해, 연속된 작업이 절반만 실행되고 결과가 저장되는 경우는 없습니다. 트랜잭션이 실행 중이라면 데이터베이스의 상태가 일시적으로 불일치하게 됩니다. 트랜잭션을 끝내기 위해 Commit(변화를 적용한다) 혹은 Rollback(변화를 적용하지 않는다)을 수행하고 나서야 변화가 적용됩니다.

 

Transaction이 필요한 경우에 대한 예시

 

이제 계좌이체를 하는 상황을 다시 생각해 봅시다. memberA가 memberB에게 2000원을 송금하는 경우입니다. 트랜잭션에 따라 순차적으로 작업을 수행합니다.

1. memberA의 계좌에서 2000원을 빼냅니다.
2. memberB의 계좌에 2000원을 더합니다.

 

그런데 2번 작업(memberB의 계좌에 2000원을 더합니다)을 수행하던 중 오류가 발생했습니다. 그 결과 memberA는 계좌에서 2000원을 빼내어 8000원이 되었지만, memberB의 계좌는 여전히 10000원인 상태입니다. 만약 Transaction 개념이 없다면 이러한 변화가 그대로 적용되어 큰 문제가 발생하게 됩니다.

 

Transaction이 존재한다면 무엇이 달라질까요? 2번 작업에서 오류가 발생하는 경우, 변화를 되돌리는 Rollback 명령어를 수행하기만 하면 됩니다. 그렇게 되면 1번 작업에 의해 일어난 데이터의 변화를 적용하지 않게 됩니다. 따라서, 송금을 시도하기 전으로 데이터가 돌아가게 됩니다. 즉, 데이터의 안정성을 확보할 수 있게 되는 것입니다.


ref.

https://www.geeksforgeeks.org/transaction-in-dbms/

https://fauna.com/blog/database-transaction