본문 바로가기
Database

데이터베이스 트랜잭션(transaction)의 중요성

by 코더 제이콥 2023. 4. 2.

개요

우리는 데이터베이스 세상에 살고 있습니다. 친구에게 카카오톡을 보낼 때, 저녁을 먹기 위해 배달앱을 가게를 둘러볼 때, 어버이날 때 부모님 용돈 드리기 위해 돈을 입금할 때 등. 가벼운 일부터 돈과 관련된 중요한 일까지 이 모든 일련의 과정에는 데이터베이스가 존재합니다.

그럼 우리는 왜 데이터베이스를 사용할까요? 많은 이유들이 있겠지만, 그중 하나로 데이터베이스에는 트랜잭션이란 기능을 제공하기 때문입니다.

1. 트랜잭션이란?

트랜잭션의 사전적 정의입니다. 네이버 사전에는 이렇게 정의하고 있네요.

트랜잭션은 거래, 처리 과정이란 뜻을 담고 있습니다. 이는 데이터베이스의 트랜잭션 기능에도 이어집니다. 데이터베이스의 트랜잭션은 하나의 처리 과정을 안전하게 보장하는 기능입니다. 예를 들어봅시다.

  • a는 부모님에게 100만원을 입금하고자 함.
  • a는 카카오뱅크, 부모님은(어머니라 한정하겠음) 신한은행을 사용하고 있음.
  • a의 카뱅 계좌에 100만원이 차감됨
  • 어머니 신한은행 계좌에 100만원이 추가됨

이 과정을 SQL로 작성해볼까요?

UPDATE member_account
SET balance = balance - 1000000
WHERE member_name = 'a';

UPDATE member_account
SET balance = balance + 1000000
WHERE member_name = 'a_mother';

쿼리문을 보면서 고려해야 할 부분이 보입니다. 백 만원을 보내려고 봤는데 a의 계좌에 백 만원이 없는 경우. 또는 백 만원은 있었지만, 송금하는 과정에서 에러가 발생한 겁니다. 그래서 a의 계좌에 백 만원이 차감되었는데, 어머니 계좌에 백 만원이 입금되지 않은 것이죠.

이런 경우를 대비해서 등장한 것이 바로 데이터베이스의 rollback과 commit 명령어입니다.

2. 트랜잭션의 ROLLBACK, COMMIT 연산

롤백과 커밋은 트랜잭션 처리 과정 중 사용되는 연산입니다. 

  • 롤백: 하나의 트랜잭션을 처리하는 과정 중에 오류가 발생하거나, 트랜잭션 처리 결과가 원하는 대로 나오지 않았을 때, 이전 상태로 되돌리는 연산입니다. 롤백 명령어를 사용하면 트랜잭션 처리 과정 중인 모든 작업이 취소되며, 데이터베이스는 이전 상태로 되돌아갑니다.
  • 커밋: 하나의 트랜잭션을 처리하는 과정 중에 문제가 없이 모든 작업이 완료되었을 때, 변경 내용을 영구적으로 적용하는 것을 말합니다. 커밋 명령어를 사용하면 데이터베이스에 대한 변경 내용이 영구적으로 적용되고, 이전 상태로 되돌아갈 수 없습니다.

트랜잭션 개념을 배울 때 롤백과 커밋이란 용어는 상당히 생소합니다. 하지만, 사실은 우리가 모르게 이것들은 동작했습니다. 우리가 따로 설정하지 않으면 SQL문은 자동으로 커밋합니다. 따라서 위의 예시에서 언급한 SQL은 우리가 모르게 자동으로 커밋된 것입니다.

예시에서 본 우리의 문제가 무엇일까요? 무슨 문제가 터졌음에도 불구하고 2개의 SQL문이 자동으로 커밋되어서 데이터베이스에 반영되었던 문제였습니다. 

  1. a의 계좌에서 백 만원이 차감 되었음.
  2. 어머니의 계좌에 백 만원이 입금되지 않았음. 

지금 우리에게 필요한 것은, 문제가 생겼을 때 커밋되지 않고 되돌려야 하는 기능입니다. 즉, 롤백 기능이 필요한 것입니다.

이때 데이터베이스의 트랜잭션 기능이 등장합니다. 트랜잭션은 〈a의 계좌 100만원 차감 → 어머니의 계좌 100만원 입금〉이란 두 가지의 처리 과정을 하나의 처리 과정으로 묶고, 두 가지의 처리 과정 중 어느 하나라도 문제가 생긴다면 롤백을, 모든 처리 과정이 성공했을 때 커밋을 하는 기능을 제공합니다.

데이터베이스 중 MySQL에서는 트랜잭션을 다음과 같이 처리할 수 있습니다.

START TRANSACTION;

UPDATE member_account
SET balance = balance - 1000000
WHERE member_name = 'a';

UPDATE member_account
SET balance = balance + 1000000
WHERE member_name = 'a_mother';

COMMIT;

트랜잭션을 시작하려면 START TRANSACTION; 명령문을 사용합니다. 그리고 작업을 완료한 후에 COMMIT; 명령문을 사용해 트랜잭션을 커밋해야 합니다. 만약, 작업 중 오류가 발생했다면, ROLLBACK; 명령문을 사용하여 트랜잭션을 롤백합니다.

위 코드에서는 두 가지의 업데이트 쿼리를 하나의 트랜잭션으로 선언했습니다. 따라서 이 작업들은 하나의 트랜잭션 내에서 수행되며, 모든 작업이 성공적으로 수행되면 COMMIT; 명령문이 호출되어 트랜잭션이 커밋됩니다. 만약, 작업 중 하나라도 오류가 발생하면 ROLLBACK; 명령문이 호출되어 트랜잭션을 롤백합니다.

3. 트랜잭션 ACID 원칙

이러한 트랜잭션은 ACID 원칙을 보장해야 합니다. ACID 원칙은 다음과 같습니다.

원자성 (Atomicity)
하나의 트랜잭션 내 일어나는 작업들은 하나 같이 모두 성공하거나 실패해야 함
일관성 (Consistency)
모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 함. (무결성 제약 조건을 항상 만족해야 함)
독립성 (Isolation)
동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리함.
지속성 (Durability)
성공적으로 수행된 트랜잭션은 영원히 반영되어야 함. (로그와 같은 것으로)