[Oracle] Transaction이란?
안녕하세요. 갓대희 입니다. 이번 포스팅은 [ [오라클] 트랜잭션 (Transactions) ] 입니다. : )
Transactions
우리가 흔히 간략하게 알고있는 트랜잭션에 관련 된 수준은 다음과 같다.
1. 하나의 논리적 작업 단위를 구성하는 하나 이상의 sql문
2. 트랜잭션의 효과를 데이터베이스에 확정 하기 → commit
3. 트랜잭션의 효과를 테이터베이스에 취소하기 → rollback
▶ 트랜잭션의 사용 이유??
- 사용자, 오라클 서버, 애플리케이션 개발자, DBA 등에게 데이터 일치성과 데이터 동시발생을 보장하기 위해
▶ 1. 커밋 하기전 상태
1. 롤백 세그먼트 버퍼가 서버에 만들어 진다.
2. 트랜잭션의 소유자는 select문을 사용하여 트랜잭션의 효과를 볼 수 있다.
3. 데이터베이스의 다른 용법으로는 트랜잭션의 효과를 볼 수 없다.
4. 영향을 받은 행들을 lock되며 다른 사용자들들 영향을 받은 행 안에 있는 데이터를 변경할 수 없다.
▶ 2. 커밋 후 상태
1. 영향받은 행에 수용된 lock 해제.
2. 트랜잭션이 완료된 것으로 표시된다.
3. 서버의 내부 트랜잭션 테이블이 시스템 변경 번호를 생성하고, 이 번호를 트랜잭션에 대입하고, 번호들을 모두 테이블에 저장한다.
▶ 3. 롤백 후 상태
rollback명령을 실행하면 현재 트랜잭션이 행한 모든 변경을 해제한다
※ 한번도 실무에서 사용해 본 적은 없지만 rollback to savepoint를 사용하여 일부만 rollback할 수 있다.
ex)
SELECT * FROM EMP; -- 3개의 데이터 존재
DELETE FROM EMP WHERE EMPNO = '1'; -- EMPNO 1 회원 삭제
SAVEPOINT SP1; --저장점(savepoint) 만들기
DELETE FROM EMP WHERE EMPNO = '2'; -- EMPNO 1 회원 삭제
SAVEPOINT SP2; --저장점(savepoint) 만들기
ROLLBACK TO SP1; --특정 저장시점으로 Transaction 상태 변경
-- SP2 시점으로 원복 되어 EMPNO 2 번 회원이 되살아 난 것을 볼 수 있다.
ROLLBACK; --전체 롤백
-- 모든 데이터 원복
이 Rollack Commit 등 Transaction을 유지 하기위해 사용 되는 것 중 하나가 롤백 세그먼트 (Rollback Segment)라고 한다. 정말 간단히만 살펴보자.
Rollback Segment
- 롤백 세그먼트는 수정되기 전의 파일, 블록 ID같은 블럭 정보 및 데이터를 저장
( 간단히 데이터를 처리 하는데 변경 이전 롤백 이미지를 저장)
▶ 트랜잭션 롤백
- 트랜잭션이 테이블내의 행을 변경할 때 Before image(변경되기 전의 file, block의 ID 정보와 데이터)를 롤백세그먼트에 저장 한다. 이를 이용하여 롤백처리 시 다시 원래의 값으로 복원한다.
▶ 트랜잭션 복구
- 트랜잭션이 수행되고 있을 때 인스턴스가 비정상적으로 종료될 때가 있다. 비정상 종료된 경우 커밋되지 않은 변경 사항을 롤백해야 한다.
롤백 세그먼트에 가해진 변경 사항 역시 리두로그 파일에 의해서 보호되어야만 가능 하다고 하는데 우리 싸이트의 경우 특정 시점에 오류가 무한 반복됨으로써 이 리두 영역의 DataSpace의 계속 차올라 용량이 부족하여 장애가 발생 한 적도 있었다.
▶ 인스턴스 롤백
- 트랜잭션 수행 시 정전 등 시스템 장애로 인해 인스턴스가 비정상적으로 종료되면 인스턴스가 재시작시 SMON에 의해 인스턴스가 자동복구된다.
롤백 세그먼트를 조회해보면 데충 이렇다.
자세한 내용은 다음에 공부해 보는 것으로.. 이정도면 웹개발자로써 기초 상식으론 충분한 것 같다.