일단 타이틀만 본다면 호텔 트리바고 같은 광고 같지만 꼭 짚고 넘어가야 하는 중요한 개념인 것 같아 정리해보는 시간을 갖고 싶었다. 데이터베이스에 관한 기본적인 개념을 공부하는데 자주 등장했던 용어이기도 했고 누구 물어본다면 답할 수 있는 정도의 지식을 갖고 싶었다. 그렇다면 바로 들어가볼까!
Transaction은 데이터 베이스의 완전성을 보장하기 위한, 데이터 베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 상호작용의 단위이다. 일련의 연산이 완전하게 모두 수행되거나, 아니면 아예 아무것도 실행되지 않는다. 트랜스액션이 뭐야? 라고 누가 물어본다면,
"데이터베이스에서 데이터에 대한 논리적 기능을 수행하기 위한 실행단계의 작업 단위"
라고 할 것 같다.
간단한 예를 들어본다면, 은행의 계좌 이체 시스템을 볼 수 있다. 한 계좌에서 돈을 출금해 원하는 계좌에 입금을 시키는 개념으로 계좌 이체는 하나의 단위로 완수되어야 하고 중간에 실패할 경우, 돈은 사라지고 결과는 당연히 좋지 않다.
이런 개념으로 데이터베이스의 트랜스액션은 무슨일이 있더라도 데이터가 온전한 상태로 유지되며 작용되야 한다.
ACID는 데이터베이스 Transaction이 안전하게 수행된다는 것을 보장하기 위한 성질을 가리키는 약어이다. 의 성질로는 크게 4가지가 있다.
Transaction 관련된 작업들이 부분적으로 실행되다가 중단되지 않는 것을 의미한다. 원자성은 transaction이 중간 단계까지만 실행되고 실패하는 일이 없게 한다. 그렇기에 아예 모두 반영되던지, 아니면 전혀 반영되지 않아야 한다.
Transaction이 성공적으로 실행을 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지하는 것을 의미한다. 시스템의 고정 요소는 수행 전과 수행 완료 후의 상태가 같아야 한다.
고립성은 한 Transaction 수행 시 다른 Transaction의 연산 작업이 끼어들지 못하도록 보장하고 또 해당 Transaction 밖에 있는 어떠한 연산도 현재 과정의 중간 단계 데이터를 볼 수 없음을 의미한다. 성능 관련 이유로 인해 제약 조건 중, 가장 유연성 있는 특성이다.
지속성은 성공적으로 수행된 transaction이 영원히 반영되어야 하고, 시스템 문제, DB 일관성 체크 등을 하더라도 유지되어야 한다. 전형적으로 모든 Transaction은 로그로 남고 시스템 장애 발생 전 상태로 되돌릴 수 있다. 로그에 모든 것이 저장된 후에 commit 상태로 간주된다.
활동: Transaction이 실행중인 상태
실패: 실행에 오류가 발생하여 중단된 상태
철회: 비정상적으로 종료되어 롤백 연산을 수행한 상태
부분 완료: 마지막 연산까지 실행해서 딱 커밋 연산이 실행되기 전의 상태
완료: Transaction 이 성공적으로 종료되어 커밋 연산을 실행한 후의 상태
커밋 연산은 한개의 Transaction(논리적 작업 단위)에 대한 작업이 성공적으로 끝났고 데이터베이스가 다시 일관된 상태에 있을 때, 이 연산이 완료된 것을 Transaction 관리자에게 알려주는 연산이다.
롤백 연산은 하나의 Transaction 처리가 비정상적으로 종료되어 데이터베이스의 일관성을 깨뜨렸을 때, 이 일부가 정상적으로 처리되었더라도 원자성을 살리기 위해 모든 연산을 취소하는 연산이다. 롤백 시 해당 Transaction을 재시작하거나 폐기한다.
이 두개의 대표적인 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 하기전 상태로 돌아간다.
Structured Query Language는 데이터 정의, 조작, 제어 등의 기능을 지원한다.
파싱(Parsing)
실행(Execution)
인출(Fetch)
SQL은 4가지의 종류가 있다.
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