SQL은 DBMS(Database Management System)에서 사용되는 표준 질의어로 데이터의 저장, 조회, 수정, 삭제 등을 처리하는데 사용된다. 이런 작업을 수행하는 동안 데이터의 일관성과 안전한 처리를 보장하기 위해 SQL에서는 트랜잭션(Transaction) 개념을 제공한다.
트랜젝션(Transaction)
트랜잭션은 하나 이상의 SQL 문장을 하나의 논리적인 작업 단위로 묶는 것을 의미한다. 이 작업은 데이터의 상태를 변화시키는 작업을 포함할 수 있다.
✅ 작업 단위?
작업 단위로 묶는 것은 사람마다 기준이 다르다. 이 기준은 개발자나 관리자가 데이터베이스 작업을 수행할 때 결정되는 것이다.
일반적으로 데이터베이스 작업은 여러 SQL 명령어로 이루어진다.
- INSERT INTO VALUES
- SELECT FROM (WHERE)
- UPDATE SET WHERE
- DELETE FROM WHERE
등과 같은 명령어로 데이터에 접근하는 것을 의미하며 하나의 질의어만 사용하는 것이 아니다.
예를 들어 은행 시스템에서 고객이 계좌에서 일정 금액을 인출하는 상황을 생각해볼 수 있다.
- 사용자가 인출 요청
- 은행 시스템은 계좌 잔액 확인
- 잔액이 충분한지 확인
- 충분한 잔액이 있을 경우, 잔액에서 금액 차감하고 해당 내역을 거래 내역에 기록
- 잔액이 부족하거나 기타 오류가 발생할 경우, 인출 취소 및 오류 메세지 전송
위의 과정을 데이터베이스 작업으로 옮기면 아래와 같은 트랜잭션으로 설계될 수 있다.
- 잔액 확인과 차감
- 사용자가 인출을 요청하면, 해당 계좌의 잔액을 조회(SELECT 문)
- 잔액이 인출하려는 금액보다 충분한지 확인
- 충분한 잔액이 있을 경우, 잔액에서 인출 금액을 차감 (UPDATE 문)
- 거래 내역 기록
- 인출한 금액과 계좌 정보를 이용하여 거래 내역을 작성 (INSERT 문)
- 트랜잭션 완료 또는 롤백
- 모든 작업이 정상적으로 완료되었을 경우, 트랜잭션을 커밋
- 잔액 부족이나 오류가 발생한 경우, 트랜잭션을 롤백하고 이전 상태로
⇒ 여기서 작업의 단위는 SELECT, UPDATE, INSERT 문을 모두 합친 것이다.
이렇게 트랜잭션은 여러 개의 SQL문을 하나의 논리적인 작업 단위로 묶어서 처리하며 데이터의 일관성과 안전한 처리를 보장한다.
트랜잭션의 속성 (ACID)
트랜잭션은 네 가지 속성을 가진다. 이 속성들은 데이터베이스 작업의 일관성과 안전성을 보장하는 데 큰 역할을 한다.
1. 원자성 (Atomicity)
원자성은 “All or Nothing”원칙을 의미한다. 트랜잭션 내의 모든 작업은 하나의 원자적인 단위로 처리되어야 한다. 모든 작업이 성공적으로 완료되거나 실패한 경우 이전 상태로 롤백된다. 이것은 데이터의 불일치나 중간 상태를 방지하여 일관성을 유지하게 된다.
트랜잭션은 사람이 설계한 논리적 작업 단위로 데이터베이스 작업을 관리하고 제어하는데 중요하다. 작업 단위로 데이터가 처리되지 않는다면 데이터 처리 시스템을 이해하기 어려울 뿐 더러 문제 발생 시에도 원인을 찾기가 어려워진다.
2. 일관성 (Consistency)
일관성은 트랜잭션이 실행 전후에 데이터베이스의 일관성을 보장해야 함을 의미한다. 트랜잭션 실행 전에 정의된 규칙과 제약조건을 준수해야 한다. 예를 들어, 계좌 이체 작업에서 잔액이 음수가 될 수 없는 것과 같다.
일관성은 말 그대로 데이터베이스 내의 데이터가 일관된 상태를 유지하도록 보장한다. 이는 데이터의 무결성과 기업이 운영과 관리에 적용하는 규칙을 준수하는 데 중요하다.
3. 고립성 (Isolation)
고립성은 동시에 여러 트랜잭션이 실행될 때, 각 트랜잭션이 독립적으로 실행되는 것처럼 보장되어야 함을 의미한다. 한 트랜잭션의 작업이 다른 트랜잭션에 영향을 주지 않고 독립적으로 처리되어야한다.
고립성은 동시성 제어를 통해 데이터의 일관성과 안전성을 보장한다. 여러 사용자가 동시에 데이터베이스에 접근하더라도 각 트랜잭션이 서로 간섭받지 않고 안전하게 수행된다.
4. 지속성 (Durability)
한 번 커밋된 트랜잭션의 결과가 영구적으로 저장되어야 함을 의미한다. 성공적으로 커밋(Commit)된 트랜잭션의 변경 사항은 시스템 장애나 전원 손실과 같은 문제가 발생해도 계속 유지되어야 한다.
지속성은 데이터베이스의 안정성과 신뢰성을 보장한다. 커밋된 데이터는 영구적으로 저장되므로, 시스템 장애 또는 복구 작업 후에도 데이터의 무결성이 유지된다.
커밋(commit)과 롤백(rollback)
커밋과 롤백은 데이터베이스 트랜잭션에서 필수적인 동작으로, 데이터의 일관성과 무결성을 보장하는 데 중요한 역할을 한다. 커밋은 트랜잭션을 성공적으로 완료하고 변경 사항을 영구적으로 반영하는 단계이며, 롤백은 문제가 발생했을 때 이전 상태로 되돌리는 작업이다.
커밋(Commit)
커밋은 트랜잭션에서 수행한 작업을 영구적으로 데이터베이스에 적용하는 단계이다. 트랜잭션의 모든 변경 사항을 데이터베이스에 반영하는 것을 의미한다. 커밋이 발생하면 트랜잭션은 성공적으로 완료 되었으며 데이터베이스는 변경된 상태를 유지한다.
커밋된 데이터는 다른 사용자들에게도 보여진다. 만약 테이블(table)을 수정 후 커밋을 하지 않았다면 내가 보이는 작업 창에서는 수정 된 테이블이 보이겠지만, 다른 사용자들에게는 아직 수정 전 table이 보이게 된다. 이렇게 커밋은 작업 단위를 완료하고 데이터의 일관성을 유지하는 데 중요한 역할을 한다.
롤백(rollback)
롤백은 트랜잭션에서 문제가 발생했거나 실패한 경우에 이전 상태로 되돌리는 작업이다. 즉, 트랜잭션에서 수행한 변경 사항을 취소하고 이전 상태로 복구한다. 롤백은 트랜잭션을 취소하고 데이터베이스를 이전 일관된 상태로 되돌리는 역할을 한다. 트랜잭션의 중간 단계에서 문제가 발생하거나 예외가 발생했을 떄 롤백이 수행되어 데이터의 일관성과 무결성을 유지한다.
롤백된 데이터는 다른 사용자들에게 보이지 않게 된다. 만약 작성 중 잘못했는데 이전 상태로 돌리고 싶다면 롤백을 사용할 수 있다. 이와 더불어 되돌아갈 위치를 정해 놓는 SAVEPOINT 가 있다.
오늘 사용해본 많은 쿼리문들에 대해서도 블로깅을 해야 하고 스키마에 대해서도 블로깅을 해야하는데 정말 끝도 없다. 오늘 질의 응답 시간에 모르는 게 있으면 트리구조로 공부하듯이 파고 파고 또 파서 다시 내가 아는 단어가 나왔을 때 까지 공부하라고 하셨다. 그러기에는 항상 시간이 너무 부족하다. 사실 시간이 부족하다는 것도 어떻게 보면 핑계인 것 같기는 하다. ㅎㅎ
파고 파다보면 정말 끝도 없어지는 것 같다. 세상엔 배울 것이 참 많다고 한 번 더 느끼게 되는 하루이다.
🔗 참고
https://d2.naver.com/helloworld/407507
https://docs.oracle.com/cd/B19306_01/server.102/b14220/transact.htm
'LANGUAGE > MySQL' 카테고리의 다른 글
[MySQL] 필드 기본값(Default) 설정하기 (1) | 2023.06.04 |
---|---|
[MySQL] MySQL 자주 사용하는 쿼리문 / 쿼리문 실행 순서 정리 (0) | 2023.05.26 |
[SQL] 데이터베이스 언어: DDL, DML, DCL, TCL의 이해와 활용 (0) | 2023.05.25 |
[DATABASE] 데이터 베이스 개체 알아보기 / 인덱스(INDEX), 뷰(VIEW), 스토어드 프로시저(STORED PROCEDURE), 트리거(TRIGGER) 등 (0) | 2023.05.25 |
[Database] 데이터베이스(Database)란? / DBMS와 RDBMS 그리고 SQL 알아보기 (0) | 2023.05.24 |