# 18_Transaction_거래를_시작하지
18_Transaction_거래를_시작하지
조금 더 생각해 보고 싶은 부분을 공부한 글입니다.
- 작성일: 2024-06-29
- 수정일: 2024-07-09
주제를 선정한 이유
최근에 Transaction 관련 문제로 코드를 한 번 크게 수정했습니다. 성능 상의 문제로 해당 Transaction은 다시 수정되었지만, 오랜만에 '이게 Transaction의 논리적 단위지🔥!'라는 깨달음을 얻어 정리하고자 합니다✍️.
Transaction
Transaction이란, 데이터베이스의 상태를 변환시키는 하나의 논리적
기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 연산들을 의미합니다.
대표적인 예시로는 은행의 입출금이 있습니다. 내 통장에서 돈을 이체할 경우, 내 통장에서의 출금과 타인 통장에서의 입금은 각각 다른 동작이지만 반드시 한꺼번에 처리 되어야 할 논리적인 기능이 되는 것이지요.
논리적 기능을 어떻게 정의하냐는 사람마다, 상황마다 다릅니다. 예를 들어, 통장의 입출금만 하나의 트랜잭션으로 볼 것인가, 아니면 고객의 통장에 기록을 남기는 것까지 하나의 트랜잭션으로 담을 것인가 등의 다양한 경우가 만들어질 수 있습니다.
Transaction 특징(ACID)
ACID는 트랜잭션의 안전성을 보장하기 위해 필요한 주요한 특징들을 모아놓은 것입니다.
- 원자성(Atomicity)
트랜잭션의 연산이 모두 데이터베이스에 반영되지 않는다면 전부 반영되서는 안된다는 원칙입니다.One or Nothing
과 같은 개념이죠. 이를 통해 데이터의 오염을 방지할 수 있습니다.
예를 들어 크레파스를 사서, 그림을 그린다가 하나의 트랜잭션이라면 크레파스만 사고 끝났다는 없습니다🫠. 크레파스를 사서 그림까지 그리던지, 그림을 안그릴거면 크레파스를 환불해야 합니다🥸.
방금 전은 가벼운 예시지만, 원자성을 지키는 것의 중요하고도 대표적인 예시는 송금입니다. 내 통장에서 돈을 빼서 타인 통장에 입금을 할 경우, 내 통장에서 돈만 빼내는 건 안됩니다☠️. 타인 통장에 입금을 실행하지 못하게 된다면 내 통장에 돈을 다시 돌려줘야 합니다😐.
- 일관성(Consistency)
트랜잭션 이후에도 이전과 동일하게, 즉 일관되게 데이터베이스의 제약이나 규칙을 만족시켜야 한다는 것입니다.
송금 예시와 연결지어 생각해보면, 데이터베이스에 입금은 반드시 0원보다 커야한다라는 규칙이 있다면 제 통장에서 0원이 출금되고, 타인의 통장에 0원이 입금된다하면 원자성은 만족하지만 일관성은 만족시키지 못하게 됩니다. 트랜잭션 이후 규칙을 만족시키지 않았기 때문이죠.
- 독립성, 격리성(Isolation)
마음에 드는 정의로 이해하시면 됩니다🫠.
- 둘 이상의 트랜잭션이 동시에 실행될 경우, 어떤 하나의 트랜잭션이 다른 트랜잭션에 끼어들 수 없다.
- 수행중인 트랜잭션이 완전히 완료될 때까지 다른 트랜잭션에서 수행 결과를 참조할 수 없다.
- 트랜잭션이 동시에 실행될 때와 연속으로 실행될 때의 데이터베이스 상태가 동일해야 한다.
트랜잭션의 독립성은 여러 의미로 설명할 수 있습니다.
계속해서 송금을 예시로 설명하자면, A->B : 30만원 송금 B->C: 20만원 송금을 한다고 했을 때,
A와 B간 1개의 트랜잭션, B와 C간 1개의 트랜잭션이므로, A, B, C의 관계를 하나로 묶어서 A: 30만원 출금, B: 10만원 입금, C: 20만원 입금을 처리 할 수 없습니다.
A->B의 트랜잭션이 끝나지 않았는데, B->C 트랜잭션에서 이 결과를 참조할 수 없기 때문이죠.
- 지속성(Durability)
성공적으로 완료된 트랜잭션의 결과는 영구적으로 반영되어야 한다는 것입니다. 송금이 성공적으로 처리되었으면, 시스템(데이터베이스) 상에 기록이 되어야 한다는 의미입니다.
Transaction 연산
- Commit
한 개의 트랜잭션이 성공적으로 끝났고, 데이터베이스가 일관된 상태(=일관성)에 있을 때, 트랜잭션의 성공을, 즉 변경이 완료됬음을 트랜잭션 관리자에게 알려주는 연산입니다. - Rollback
트랜잭션이 수행되던 도중 비정상적으로 종료되어 일부만 정상적으로 처리되었을 때, 트랜잭션의 원자성을 구현하기 위해 해당 트랜잭션의 모든 연산을 취소할 것을 트랜잭션 관리자에게 알려주는 연산입니다.
정리
Transaction이란
데이터베이스에 변경을 일으키는 작업의 논리적
단위로
- 하나의 트랜잭션을 이루는 모든 내용은 전부 반영되거나 전부 반영되지 않아야하며,
- 트랜잭션 반영 이후에도 데이터베이스의 제약이나 규칙등을 지켜야 하고,
- 완료되지 않은 트랜잭션의 결과를 참조하면 안되며,
- 성공적으로 완료된 트랜잭션은 데이테베이스에 영구히 반영되어야 한다는 특징을 갖는다.