Oracle/ORACLE 용어사전

Transaction

에몽이ㅋ 2014. 6. 16. 13:28

Transaction 이란

1) 데이터베이스에서 트랜잭션(Transaction)이란 논리적인 일의 단위를 말합니다.

2) 정보의 교환이나 데이터베이스 갱신 등 일련의 작업들에 대 한 연속처리단위를 말합니다.

3) 사용자 A에 의해 데이터가 변경되는 동안 사용자 B가 A의 작업 내용을 임의로 변경하지 못하도록 하는 방법.

※ DML언어(SELECT를 제외한 INSERT, UPDATE, DELETE)를 사용하게되면 자동으로 Transaction이 시작됩니다.

※ 트랜잭션이 일어난후 데이타 입출력(INSERT, UPDATE, DELETE)이 많은 업무처리라면 보

통 100번, 500번, 1000번 단위(1500번 비추천)로 커밋을 해주는것이 좋으며 트랜잭션 처리량이

적다면 매번 COMMIT을 해주는것이 좋다.

※ 트랜잭션이 진행중일때는 롤백 세그먼트에 데이타가 저장되므로 상당한 메모리를 차지게

된다. 너무많은 데이타가 롤백 세그먼트에 들어가면 시스템이 느려지고 잘못된 처리를 할수

있습니다.

※ 테이블 사이즈가 크다면 꼭 중간중간에 커밋 명령을 줘야 정상적으로 처리됩니다.

안그러면 뻑나기 딱좋습니다. 500개 단위가 적당합니다.

Transaction 특성

원자성(Atomicity) - 트랜잭션 결과에 관련있는 모든 연산들은 완전히 실행되거나

전혀 실행되지 않아야 한다.

일관성(Consistency) - 정의된 모든 제한을 만족하여야 한다.

격리성(Isolation-아이서레이션) - 트랜잭션이 일어나면 완료되기 전까지는 다른

트랜잭션이 참조할수 없다.

내구성(Durability) - 한번 완료된 트랜잭션은 이전 사항으로 되돌아갈 수 없다.

Transaction 사용 예

단일 SQL쿼리 단위가 아닌 다중 SQL쿼리 단위로 실행해야 할경우

Transaction이 필요한 이유를 은행 현금인출기(ATM)에서 돈을 인출하는 과정으로 설명한다.

Transaction은 응집도가 낮은 단일 처리에 할때 사용하는것이 아니라 응집도가 높은 다중 처리에 꼭 필요합니다.

현금인출을 하겠다고 기계에게 알려준뒤 현금카드를 넣어서 본인임을 인증받은후 인출할 금액을 선택하면 ATM 기는 돈을 내어줍니다.
기계의 오동작이나 회선문제로 인하여 전산상으로는 돈을 인출한 것으로 입력이 되었는데 돈은 나오지 않았거나 돈은 나왔는데 일련의 에러나 문제로 인하여서 돈을 인출한 것이 전산상으로 입력이 안되면 상당히 심각한 문제가 발생한다.

때문에 전산상으로도 입력이 정상적으로 잘 되고, 돈도 인출이 정상적으로 잘 됨을 확인하고 나서야(사용자 입장에서는 "정상처리 되었습니다." 라는 메세지를 보았을때) 인출하는 하나의 과정이 정상적으로 처리되었음을 확인할 수 있습니다.

여기서 돈을 인출하는 일련의 과정이 하나의 묶음으로 처리되어야 함을 이해하실 수 있을것입니다.
그리고 혹시 처리도중 중간에 무슨 문제가 발생한다면 진행되던 인출과정 전체를 취소하고 다시 처음부터 시작하도록 해야 합니다.

이것을 트랜잭션이라고 합니다.
transaction 의 사전적의미와도 상통합니다만, 거래함에 있어서 거래하는 양측이 다 원하는
결과물을 얻어야만 정상적으로 처리되는 것이고 그렇지 않다라면 거래자체가 무산되어 원점으로
되돌려져(roll back) 버리는 것입니다.
전산적으로나 데이터베이스에 있어서도 이처럼 하나의 묶음으로 처리가 이루어져야 하는 모든것에
트랜젝션이란 개념이 사용됩니다.

롤백(roll back) 이란 것은 트랜잭션으로 인한 하나의 묶음처리가 시작되기 이전의 상태로
되돌려지는 것을 말합니다.

Transaction 간략 처리 과정

A 테이블에 DML언어(SELECT를 제외한 INSERT, UPDATE, DELETE) 중에 하나의 SQL 쿼리를 사용하게되면 트랜잭션이 자동으로 시작되고 해당 TABLE 에 LOCK 이 걸립니다.

B 테이블에 SQL쿼리(INSERT, UPDATE, DELETE)를 사용하게 되어도 계속적으로 B TABLE에 LOCK 이 적용됩니다. 왜냐하면 현재는 트랜잭션이 진행중이기 때문입니다.

A 테이블과 B 테이블에 DB처리를 끝낸후 트랜잭션 완료 명령(COMMIT)을 내리면 지금까지 제어한 테이블에 UNLOCK 이 걸림으로써 트랜잭션 진행중 제어한 데이타가 실제로 적용되고 다른 세션에서 테이블을 제어할수 있게 됩니다.

ORACLE의 경우

하나의 트랜잭션이 진행중일때 다른 세션에서 LOCK 이 걸린 테이블을 제어(SELECT을 제외한 UPDATE, INSERT, DELETE) 하게 된다면 대기상태에 빠지게 되어 한참동안 실행중이다가 타임아웃 시간을 넘기게되면 에러 메세지를 출력한후 실행을 중지한다.

TABLE LOCK 이 적용된 테이블은 해당 세션에서 트랜잭션을 완료하지 않는한 타 세션에서 DML언어(INSERT, UPDATE, DELETE)로 제어할수 없지만 SELECT SQL 쿼리는 사용가능하다.

해당 세션에서 트랜잭션을 완료하지 않은 상태에서 LOCK이 적용된 테이블은 타세션에서 조회(SELECT)는 가능하다. 하지만 조회한 데이타는 해당 세션이 트랜잭션을 시작하기전에 있던 데이타로 현재 트랜잭션중에 변경된 데이타는 적용되지 않는다.

해당 세션에서 트랜잭션을 완료함으로써 UNLOCK 이 적용된 테이블에는 DML언어(SELECT, INSERT, UPDATE, DELETE)로 제어할수 있으며 테이블안에 데이타도 트랜잭션이 종료된후의 데이타로 적용되어 진다.

DB2의 경우

하나의 트랜잭션이 진행중일때 다른 세션에서 LOCK 이 걸린 테이블을 제어(SELECT, UPDATE, INSERT, DELETE) 하게 된다면 대기상태에 빠지게 되어 한참동안 실행중이다가 타임아웃 시간을 넘기게되면 DB2 같은 경우는 아래 메세지를 출력한후 실행을 중지한다.

"SQL0911N 현재의 트랜잭션이 교착 상태 또는 시간종료로 인해 롤백되었습니다."

TABLE LOCK 이 적용된 테이블은 해당 세션에서 트랜잭션을 완료하지 않는한 타 세션에서 DML언어(SELECT, INSERT, UPDATE, DELETE)로 제어할수 없고 해당 세션에서 트랜잭션을 완료함으로써 UNLOCK 이 적용된 테이블에 DML언어(SELECT, INSERT, UPDATE, DELETE)로 제어할수 있다.

Transaction 원리



사용자가 INSERT 문을 사용해 데이터를 삽입하고, UPDATE 문으로 데이터를 갱신하고, DELETE 문으로 데이터를 삭제하였다고 합시다. 만약 이 모든 과정이 오류없이 수행되었다면 지금까지 실행한 모든 작업을 '실제로' 수행하라는 명령을 내릴 수 있는데 이 때의 명령이 바로 'COMMIT' 명령입니다. 'COMMIT' 명령을 주기 전까지의 모든 작업은 'ROLLBACK' 명령으로 원상태로 되돌릴 수 있는 것입니다. 
만약 INSERT 작업을 한 다음 'SAVEPOINT A'라는 명령을 실행하였다면 나중에 'ROLLBACK A'라는 명령을 통해 INSERT 작업을 한 그 위치로 되돌아 올 수 있는 것이죠. 그 전에 'COMMIT' 명령을 실행하지 않았다면 말입니다. 
이와 같이 COMMIT 명령으로 하나의 작업이 성공적으로 끝났을 때 우리는 트랜잭션이 성공적으로 수행되었다고 말합니다. 

트랜잭션 제어를 위한 명령어(Transaction Control Language)에는 다음과 같은 것들이 있습니다.

  • COMMIT
  • SAVEPOINT
  • ROLLBACK

설명

  • COMMIT은 저장되지 않은 모든 데이터를 데이터베이스에 저장하고 현재의 트랜잭션을 종료하라는 명령입니다. 
  • SAVEPOINT [이름]는 현재까지의 트랜잭션을 특정 이름으로 지정하라는 명령입니다. 
  • ROLLBACK [TO SAVEPOINT 이름]저장되지 않은 모든 데이터 변경 사항을 취소하고 현재의 트랜잭션을 끝내라는 명령입니다. 만약 이전에 SAVEPOINT로 지정한 이름이 있으면 그 위치까지 되돌아 갑니다.

예제)

select * from test;

update test set name2='leejunsik1';

savepoint lee;
update test set name1='jun';
rollback to lee;--부분 rollback처리
--savepoint lee 후부터의 쿼리문만 rollback된다.

--update test set name2='leejunsik1';는 commit된다.

rollback;
--commit하지 않은 전체를 rollback한다.

commit;
--commit하면 부분rollback이든 전체 rollback이든 전체 적용된다.

암시적트랜잭션처리

자동으로 현재 진행중인 Transaction commit 되는 경우

다음과 같은 경우에는 자동으로 트랜잭션이 commit된다.


DDL(CREATE, ALTER, DROP) 명령어를 실행할 때

※ DB2에서는 DDL명령어도 COMMIT을 해줘야 적용됩니다.

※ ORACLE 에서는 CREATE TABLE문은 자동 COMMIT이 됩니다,

DCL(GRANT, REVOKE) 명령어를 실행할 때

SQLGATE에서 COMMIT명령을 내린후종료할때 (메뉴에서 닫기나 창의 x버튼을 통해)

PUTTY로 리눅스쉘을 통해 SQL*PLUS을 접속하여 종료할때

(정상적으로 putty에서 EXIT명령으로 종료)

자동으로 현재 진행중인 Transaction rollback 되는 경우

다음과 같은 경우에는 자동으로 트랜잭션이 rollback된다.

SQL*Plus를 비정상적으로 종료할때

(콘솔창에서 exit창을 안치고 창의 x버튼을 통해 종료하는 경우나 컴터 파워가 나간경우)

SQL*Plus를 정상적으로 종료할때

SQL*Plus를 종료할 때(정상적으로 종료 exit명령을 통해)

※ SQL*Plus을 종료할때도 COMMIT을 해야 트랜잭션이 커밋됩니다.

SQLGATE를 비정상적으로 종료할 때

(메뉴에서 닫기나 창의 x버튼을 통해 종료하는 경우가 아닌 원도우 작업관리자의 작업끝내기같은 강제적인 종료시나 컴터 파워가 나간경우)

PUTTY로 리눅스쉘에 접속하여 SQL*Plus를 비정상적으로 종료할때

(PUTTY창을 exit창을 안치고 창의 x버튼을 통해 종료하는 경우)

COMMIT후의 데이타상태

데이터베이스에 영구적으로 데이타를 변경합니다.되돌릴수없습니다.

데이터의 COMMIT전의 상태는 완전히 상실됩니다.

COMMIT전에는 변견된 데이타는 나만 볼수고 해당 TABLE이 ROCK이걸려있지만

COMMIT후에는 모든사용자가 바뀐 내용에 대해 볼수있고 해당 작업TABLE의

ROCK이 다풀립니다.

※ 현재 트랜잭션중인 table은 트랜잭션을 사용하는 사용자만 트랜잭션이 적용된 table이 보이며 다른 사용자는 트랜잭션이 적용되지 않은 table로 보입니다.

※ TABLE이 ROCK이 걸렸다는것은 해당 TABLE에 SELECT만 가능하다는것이다. INSERT, UPDATE, DELETE는 불가능하다.

ROLLBACK후의 데이타상태

트랜잭션 중의 모든 작업들이 COMMIT 전의 작업들로 돌아갑니다.

데이터변경이 취소되고 작업하던 TABLE ROCK이 다풀리고 다른 사용자들이 TABLE 제어가 가능합니다.

COMMIT후 ROLLBAK하는 방법

ORACLE 버전이 9I 이상이라면 FlashBack 쿼리를 이용하면 ROLLBACK 이 가능하다.



출처 : 
http://zetswing.com/bbs/board.php?bo_table=ORACLE_TIP&wr_id=13&page=2&sca=&sfl=&stx=&spt=0&page=2&cwin=#c_48 

'Oracle > ORACLE 용어사전' 카테고리의 다른 글

Admin 용어사전  (0) 2012.01.17