데이터베이스 트랜잭션(Database Transaction)
1. 정의
데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용의 단위이다. 여기서 유사한 시스템이란 트랜잭션이 성공과 실패가 분명하고 상호 독립적이며, 일관되고 믿을 수 있는 시스템을 의미한다.
2. COMMIT과 ROLLBACK
1) COMMIT
- 한 트랜잭션이 성공적으로 끝났고, 데이터베이스가 일관성을 유지하며, 이 작업 단위가 수행한 연산이 완료된 것을 알려주는 연산
- 작업결과는 데이터베이스에 반영
2) ROLLBACK
- 한 트랜잭션의 수행 중 어떤 부분에서든지 한 번이라도 문제(오류)가 발생하면 해당 트랜잭션을 모두 취소하는 연산
- 작업결과는 모두 취소되게 되어 데이터베이스에 영향을 미치지 않게 됨
3. 특성
이론적으로 데이터베이스 시스템은 각각의 트랜잭션에 대해 원자성(Atomicity), 일관성(Consistency), 고립성(Isolation), 영구성(Durability)을 보장한다. 이 성질을 첫 글자를 따 ACID라 부른다.
1) Atomicity (원자성)
- 트랜잭션과 관련된 작업들이 부분적으로 실행되다가 중단되지 않는 것을 보장하는 능력
ex) 자금 이체는 성공할 수도 실패할 수도 있지만 보내는 쪽에서 돈을 빼 오는 작업만 성공하고 받는 쪽에 돈을 넣는 작업을 실패해서는 안됨
- 트랜잭션은 분리할 수 없는 하나의 단위
- 작업이 모두 수행되거나 하나도 수행되지 않아야 함
2) Consistency (일관성)
- 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지하는 것을 의미
ex) 무결성 제약이 모든 계좌는 잔고가 있어야 한다면 이를 위반하는 트랜잭션은 중단
- 이 일관성은 '잠금'과 관련이 있음
3) Isolation (격리성, 고립성)
- 트랜잭션을 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장하는 것을 의미
ex) 은행 관리자는 이체 작업을 하는 도중에 쿼리를 실행하더라도 특정 계좌간 이체하는 양 쪽을 볼 수 없음
- 트랜잭션이 발생하기 이전 상태나 완료된 이후 상태를 볼 수는 있지만, 트랜잭션이 진행 중인 중간 데이터를 볼 수 없음 (이를 피해가는 방법도 있음)
4) Durability (영속성)
- 성공적으로 수행된 트랜잭션은 영원히 반영되어야 함을 의미
- 전형적으로 모든 트랜잭션은 로그로 남고 시스템 장애 발생 전 상태로 되돌릴 수 있음
- 트랜잭션은 로그에 모든 것이 저장된 후에만 commit 상태로 간주될 수 있음
4. 목적
- 데이터베이스 기능 중, 트랜잭션을 조작하는 기능은 사용자가 데이터베이스 완전성(integrity) 유지를 확신하게 한다.
- 단일 트랜잭션은 데이터베이스 내에 읽거나 쓰는 여러 개 쿼리를 요구한다. 이 때 중요한 것은 데이터베이스가 수행된 일부 쿼리가 남지 않는 것이다. 예를 들면, 송금을 할 때 한 계좌에서 인출되면 다른 계좌에서 입금이 확인되는 것이 중요하다.
- 트랜잭션은 서로 간섭하지 않아야 한다.
5. 종류
1) 자동 커밋 트랜잭션 (Autocommit transactions)
- 각 쿼리마다 자동적으로 BEGIN TRAN ... COMMIT TRAN이 붙여지는 것을 의미
- SQLServer는 '자동 커밋 트랜잭션'을 디폴트로 사용
update v_userTbl set addr='부산' where userid = 'JKW';
update v_userTbl set addr='대전' where userid = 'KMS';
update v_userTbl set addr='서울' where userid = 'PJH';
위의 쿼리문에서 트랜잭션은 몇 번이나 발생했을까? UPDATE 가 3번 반복되었기 때문에 트랜잭션이 한 번만 발생했다고 생각할 수 있다. 하지만 사실은 내부적에서 자동으로 구문마다 각각 트랜잭션이 발생했다. 즉, 트랜잭션을 명시하지 않으면 자동으로 발생하게 된다.
mysql에서 자동 트랜잭션을 하지 않기 위해서는 ‘SET AUTOCOMMIT=0’ 구문을 실행한다. 만약 자동 커밋 기능을 OFF한 상태에서 COMMIT을 하지 않고 MySQL을 종료하면 그 작업 내용은 반영되지 않는다. ‘SELECT @@AUTOCOMMIT’ 구문을 실행하여 자동 커밋의 상태를 알 수 있다.
DROP DATABASE, DROP TABLE, DROP, ALTER TABLE과 같은 명령어들은 자동으로 커밋이 되므로 이전의 상태로 되돌릴 수 없다.
2) 명시적 트랜잭션 (Explicit transactions)
- 직접 트랜잭션의 발생을 명시함
delimiter $$
begin
update v_userTbl set addr='부산' where userid = 'JKW';
update v_userTbl set addr='대전' where userid = 'KMS';
update v_userTbl set addr='서울' where userid = 'PJH';
end$$
delimiter ;
mysql에서는 위와 같이 트랜잭션을 명시할 수 있다. 위 세 개의 UPDATE문은 하나의 트랜잭션으로 처리된다. 트랜잭션에서 COMMIT 또는 ROLLBACK을 사용하기 위해서는 직접 명령어를 입력해야 한다.
‘DELIMITER $$’ 이 구문은 sql의 종료 문자를 $$로 변경한다는 의미이다. 따라서 위의 구문의 내용과 질문 내용을 간략히 정리하면, [명령어] ~~~~~~~~~~~~~~~~ END$$ 가 하나의 SQL문으로 작성됨을 의미한다.
데이터베이스 회복 (DB Recovery)
1. 정의
데이터베이스 운영 중에 예기치 못한 장애(Failure)가 발생할 경우, 데이터베이스를 장애 발생 이전의 일관된 상태(Consistent state)로 복원시키는 것
2. 장애 유형
1) 트랜잭션 실패 : 내부적인 오류로 트랜잭션을 완료할 수 없거나, 시스템이 교착 상태(Deadlock)와 같은 상태에 도달하여 트랜잭션을 완료할 수 없는 경우
2) 시스템 손상 : 하드웨어 실패나 DBMS, OS 오류로 인한 장애
3) 디스크 고장 : 디스크 블록이 헤드의 손상이나 고장으로 인해 내용이 손실되는 경우
3. UNDO와 REDO
1) UNDO
데이터베이스가 비정상 종료되었을 때, 디스크에 저장된 로그를 분석하여 트랜잭션의 시작은 있지만 COMMIT 기록이 없는 트랜잭션들의 작업을 취소함(UNDO)(즉, 로그를 이용하여 데이터베이스 내에서 해당 데이터 항목에 대해 이후 값을 이전 값으로 변경)
2) REDO
데이터베이스가 비정상 종료되었을 때, 디스크에 저장된 로그를 분석하여 트랜잭션의 시작과 COMMIT 기록이 있는 트랜잭션들의 작업을 재작업(REDO)함(즉, 로그를 이용하여 데이터베이스 내에서 해당 데이터 항목에 대해 이전 값을 이후 값으로 변경)
4. 기법
1) 지연갱신 기법 (Deferred Update)
2) 즉시갱신 기법 (Immediate Update)
3) 그림자 페이지 대체 기법 (Shadow Paging Update)
- 갱신이전의 데이터베이스를 일정 크기의 페이지형태로 구성하여 각 페이지마다 복사본인 그림자 페이지로 보관하여 둔다.
- 실제 페이지를 대상으로 트랜잭션에 의한 갱신작업을 하다가 장애가 발생하여 트랜잭션을 ROLLBACK할 때 갱신 이후의 실제 페이지 부분에 그림자 페이지를 대체하여 회복한다.
- UNDO, REDO, 로그 부분이 필요하지 않다.
4) 검사점 기법 (Check Point Update)
- 트랜잭션 실행 중에 특정단계에서 다시 실행 할 수 있도록 갱신 및 시스템의 정보와 함께 검사 지점을 두어 문제발생시 그 부분부터 다시 작업을 한다. (회복시간 단축)
출처
[트랜잭션]
https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4_%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98
http://egloos.zum.com/sweeper/v/3003805
http://whdudgn.tistory.com/28
http://www.tested.co.kr/board/Study/view/wr_id/14/sca/3
http://recoveryman.tistory.com/187
[Delimiter]
http://www.mysqlkorea.com/gnuboard4/bbs/board.php?bo_table=community_03&wr_id=3487
[회복]
https://www.google.co.kr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&ved=0ahUKEwiIvJbw8avQAhUKT7wKHTN-DioQFggoMAI&url=http%3A%2F%2Fcfile6.uf.tistory.com%2Fattach%2F26539F3C51B7000A29EDE2&usg=AFQjCNGpbTZnG5uldq6tjx-oWvkJJ14G_w&sig2=nVvoKPH1649z_6rhkwvVFw&bvm=bv.138493631,d.dGc&cad=rja
http://middleware.tistory.com/entry/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%ED%9A%8C%EB%B3%B5%EA%B8%B0%EB%B2%95
http://abydos.tistory.com/37
'데이터베이스' 카테고리의 다른 글
[데이터베이스] FK의 사용 (0) | 2017.01.12 |
---|---|
우분투 16.04 msyql 설치 및 utf-8 설정 (0) | 2016.12.20 |
[데이터베이스] mysql join (0) | 2016.12.05 |
회복 다시 정리 (0) | 2016.11.29 |