Database - Transaction & SQL

Joshua Song / 송성현·2020년 3월 3일
0

데이터베이스

목록 보기
1/4
post-thumbnail

Introduction

일단 타이틀만 본다면 호텔 트리바고 같은 광고 같지만 꼭 짚고 넘어가야 하는 중요한 개념인 것 같아 정리해보는 시간을 갖고 싶었다. 데이터베이스에 관한 기본적인 개념을 공부하는데 자주 등장했던 용어이기도 했고 누구 물어본다면 답할 수 있는 정도의 지식을 갖고 싶었다. 그렇다면 바로 들어가볼까!

Transaction

Definition

  • Transaction은 데이터 베이스의 완전성을 보장하기 위한, 데이터 베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 상호작용의 단위이다. 일련의 연산이 완전하게 모두 수행되거나, 아니면 아예 아무것도 실행되지 않는다. 트랜스액션이 뭐야? 라고 누가 물어본다면,
    "데이터베이스에서 데이터에 대한 논리적 기능을 수행하기 위한 실행단계의 작업 단위"
    라고 할 것 같다.

  • 간단한 예를 들어본다면, 은행의 계좌 이체 시스템을 볼 수 있다. 한 계좌에서 돈을 출금해 원하는 계좌에 입금을 시키는 개념으로 계좌 이체는 하나의 단위로 완수되어야 하고 중간에 실패할 경우, 돈은 사라지고 결과는 당연히 좋지 않다.

이런 개념으로 데이터베이스의 트랜스액션은 무슨일이 있더라도 데이터가 온전한 상태로 유지되며 작용되야 한다.

Property (ACID)

ACID는 데이터베이스 Transaction이 안전하게 수행된다는 것을 보장하기 위한 성질을 가리키는 약어이다. 의 성질로는 크게 4가지가 있다.

Atomicity (원자성)

Transaction 관련된 작업들이 부분적으로 실행되다가 중단되지 않는 것을 의미한다. 원자성은 transaction이 중간 단계까지만 실행되고 실패하는 일이 없게 한다. 그렇기에 아예 모두 반영되던지, 아니면 전혀 반영되지 않아야 한다.

Consistency (일관성)

Transaction이 성공적으로 실행을 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지하는 것을 의미한다. 시스템의 고정 요소는 수행 전과 수행 완료 후의 상태가 같아야 한다.

Isolation (고립성 / 독립성)

고립성은 한 Transaction 수행 시 다른 Transaction의 연산 작업이 끼어들지 못하도록 보장하고 또 해당 Transaction 밖에 있는 어떠한 연산도 현재 과정의 중간 단계 데이터를 볼 수 없음을 의미한다. 성능 관련 이유로 인해 제약 조건 중, 가장 유연성 있는 특성이다.

Durability (지속성)

지속성은 성공적으로 수행된 transaction이 영원히 반영되어야 하고, 시스템 문제, DB 일관성 체크 등을 하더라도 유지되어야 한다. 전형적으로 모든 Transaction은 로그로 남고 시스템 장애 발생 전 상태로 되돌릴 수 있다. 로그에 모든 것이 저장된 후에 commit 상태로 간주된다.

Transaction 상태

활동: Transaction이 실행중인 상태
실패: 실행에 오류가 발생하여 중단된 상태
철회: 비정상적으로 종료되어 롤백 연산을 수행한 상태
부분 완료: 마지막 연산까지 실행해서 딱 커밋 연산이 실행되기 전의 상태
완료: Transaction 이 성공적으로 종료되어 커밋 연산을 실행한 후의 상태

Transaction 연산

Commit 연산

커밋 연산은 한개의 Transaction(논리적 작업 단위)에 대한 작업이 성공적으로 끝났고 데이터베이스가 다시 일관된 상태에 있을 때, 이 연산이 완료된 것을 Transaction 관리자에게 알려주는 연산이다.

Rollback 연산

롤백 연산은 하나의 Transaction 처리가 비정상적으로 종료되어 데이터베이스의 일관성을 깨뜨렸을 때, 이 일부가 정상적으로 처리되었더라도 원자성을 살리기 위해 모든 연산을 취소하는 연산이다. 롤백 시 해당 Transaction을 재시작하거나 폐기한다.

Commit 과 RollBack의 장점

  • 데이터의 무결성(데이터의 정확성과 일관성을 유지하고 보증하는 것)이 보장된다.
  • 영구적인 변경 전에 데이터의 변경 사항을 확인할 수 있다.
  • 논리적으로 연관된 작업을 그룹화 할 수 있다.
    롤백 세그먼트: 롤백 이미지(이전 이미지)를 저장하는 객체.

Savepoint

  • 세이브포인트는 Transaction 진행되는 중에 수립되는데, 데이터베이스 갱신을 세이브포인트 지점까지 롤백할 수 있도록 하기 위해서이다. 이 연산은 부분 롤백 (partial rollback)이라고 하는데 부분 롤백에서는 데이터베이스의 CRUD는 하지 않은 것으로 되고 세이브 포인트 지점을 포함하여 이전에 진행된 Transaction 연산은 그대로 유지된다. 이후에 Transaction은 다른 연산을 계속 진행할 수 있다.
  • 세이브 포인트는 Transaction의 어느 시점에서도 만들 수 있고 몇 개라도 어떤 주어진 시점에 사용될 수 있다.

MySQL / MariaDB상의 연산

이 두개의 대표적인 RDBMS에서 Commit / RollBack 그리고 Savepoint 사용하려면 먼저 autocommit 의 여부를 알아봐야한다. 다른 SQL들도 비슷하겠지만 내가 사용해본 MySQL과 MariaDB를 예제로 들어보고 싶다.

SELECT@@AUTOCOMMIT 이라는 문을 치면 여부가 나오는데 1이나 True가 나온다면 사용중이라는거고 0이나 False가 나온다면 사용중이 아니라는 것이다. MySQL과 MariaDB가 과거 버전에서 주요적으로 사용하는 저장엔진인 MyISAM은 Transaction을 지원하지 않았지만 현재 MySQL 엔진인 InnoDB와 MariaDB의 엔진인 XtraDB(InnoDB 대체, 하지만 모르는 엔진도 많다!)은 Transaction을 지원한다.

사용을 위해서는 SET AUTOCOMMIT = 0를 작성해 오토커밋을 해제해줘야한다. 실제로 SQL문을 실행한다 하고 예제를 작성해보자!

#AUTO COMMIT 해제!
SET AUTOCOMMIT = 0;

#Transaction 시작
START TRANSACTION;

#UPDATE 진행
UPDATE CATS SET NAME = 'Cutie' WHERE id = 1;

이후 데이터가 제대로 업데이트 됬다면

COMMIT

업데이트 하기 전으로 돌리고 싶다면

ROLLBACK

을 실행한다.

이제 Savepoint를 사용해서 돌아가보고 싶다면,

#AUTO COMMIT 해제!
SET AUTOCOMMIT = 0;

#Transaction 시작
START TRANSACTION;

#UPDATE 진행
SAVEPOINT A;
UPDATE CATS SET NAME = 'Cutie' WHERE id = 1;

SAVEPOINT B;
UPDATE CATS SET NAME = 'Tough' WHERE id = 2;

이후 커밋과 업데이트를 진행해준다. 그리고 설정해놓은 세이브포인트로 돌아가고싶다면,

ROLLBACK TO SAVEPOINT B

그러면 업데이트 B 하기전 상태로 돌아간다.

SQL

Structured Query Language는 데이터 정의, 조작, 제어 등의 기능을 지원한다.

실행 순서

파싱(Parsing)

  • SQL 문의 문법을 확인하고 구문분석한다.
  • 구문분석한 SQL문은 Library Cache에 저장한다.

실행(Execution)

  • 옵티마이저(Optimizer)가 수립한 실행계획에 따라 SQL을 실행한다.

인출(Fetch)

  • 데이터를 읽어서 전송한다.

종류

SQL은 4가지의 종류가 있다.

DDL (Data Definition Language)

  • 관계형 데이터베이스의 구조를 정의하는 언어이다.
  • Create, Alter, Drop, Rename 문이 있다.

DML (Data Manipulation Language)

  • 테이블에서 데이터를 입력, 수정, 삭제, 조회한다.
  • Insert, Update, Delete, Select 문이 있다.

DCL (Data Control Language)

  • 데이터베이스 사용자에게 권한을 부여하거나 회수한다.
  • Grant, Revoke 문이 있다.

TCL (Transaction Control Language)

  • Transaction을 제어하는 명령어이다.
  • Commit, Rollback 문이 있다.

Truncate vs Delete

Truncate: 모든 행을 삭제하기 위한 DDL 명령어. 자동커밋으로 롤백 불가

  • 삭제하는 속도가 빠르다. 명확한 삭제를 위한 명령어.

DELETE: 행을 삭제하기 위한 DML 명령어. WHERE절로 원하는 행만 삭제 가능. 롤백가능.

  • 삭제하는 속도가 늦다.

마무으리

간단히 Transaction을 공부하려 했는데 파고 파다보니 너무나도 깊은 영역이였다. 아직 공부할 부분이 너무나도 많지만, 현재 단계에서 빠지만 헤어나올 수 없을 것 같아 미뤄야 겠다. (데이터베이스의 락과 최적화 등...)
그래도 누가 물어보면 답할 정도로 공부를 한 것 같아 조금의 안심이 된다. 데이터베이스의 세계는 넓다!
개인적으로도 궁금증이 어느정도 해소된거 같아 기쁘다. 앞으로 공부할 것도 많아서 기대된다.

참고
https://bryan7.tistory.com/78
https://88240.tistory.com/458
https://mainichibenkyo.tistory.com/76
http://m.1day1.org/cubrid/manual/syntax/syntax_tran_tran_savepoint.htm
https://coding-factory.tistory.com/226
https://ko.wikipedia.org/wiki/ACID

profile
Grow Joshua, Grow!

0개의 댓글