본문 바로가기

데이터베이스/RDBMS

[Oracle] 트랜잭션 Transaction, TCL

반응형
트랜잭션이란?
  • 트랜잭션은 데이터베이스의 논리적 연산 단위이다.
  • 하나의 트랜잭션에는 하나 이상의 SQL 문장이 포함된다. 
  • 트랜잭션은 의미적으로 분할할 수 없는 최소의 단위이다.
  • 트랜잭션은 ALL OR NOTHING의 개념이다. 
  • e.g. 계좌이체라는 작업 단위는 두 개의 스텝이 모두 성공적으로 완료되어 을 때 종료된다. 
    둘 중 하나라도 실패할 경우 계좌이체는 원래의 금액을 유지하고 있어야만 한다.

 

트랜잭션 특성

⭐️원자성 ⭐️

(atomicity)

트랜잭션에서 정의된 연산들은 모두 성공적으로 실행되던지 아니 면 전혀 실행되지 않은 상태로 남아 있어야 한다. (all or nothing)

원자성을 충족하기 위해 데이터베이스는 잠금(LOCK) 기능을 제공하고 있는데, 잠금은 트랜잭션이 수행하는 동안 특정 데이터에 대해서 다른 트랜잭션이 동시에 접근하지 못하도록 제한하는 기법이다.

일관성

(consistency)

트랜잭션이 실행 되기 젂의 데이터베이스 내용이 잘못 되어 있지 않다면 트랜잭션이 실행된 이후에도 데이터베이스의 내용에 잘못이 있으면 안된다.

고립성

(isolation)

트랜잭션이 실행되는 도중에 다른 트랜잭션의 영향을 받아 잘못된 결과를 만들어서는 안된다.

지속성

(durability)

트랜잭션이 성공적으로 수행되면 그 트랜잭션이 갱신한 데이터베이스의 내용은 영구적으로 저장된다.

 

TCL

TRANSACTION CONTROL LANGUAGE

 

  • 커밋 (COMMIT) : "변경된 데이터를 데이터베이스에 영구적으로 반영하라"
  • 롤백 (ROLLBACK) : "변경된 데이터가 문제가 있으니 변경 전 데이터로 복귀하라"
  • 저장점 (SAVEPOINT) : "데이터 변경을 사전에 지정한 저장점까지만 롤백하라"

 

 COMMIT 

COMMIT 명령어는 INSERT 문장, UPDATE 문장, DELETE 문장 사용 후에 일련의 변경 작업이 완료되었음을 데이터베이스에 알려 주기 위해 사용한다.

INSERT INTO PLAYER (PLAYER_ID, TEAM_ID,
PLAYER_NAME, POSITION, HEIGHT,WEIGHT, BACK_NO)
VALUES ('1997035', 'K02', '이운재', 'GK', 182, 82, 1);

UPDATE PLAYER
SET HEIGHT = HEIGHT + 10;

COMMIT;
커밋 완료.

 

COMMIT (트랜잭션 완료) 이후의 데이터 상태는 다음과 같다.

  • 데이터에 대한 변경 사항이 데이터 베이스에 반영된다.
  • 이전 데이터는 영원히 잃어버리게 된다. (별도 로그 보관 시 복구 가능)
  • 모든 사용자는 결과를 볼 수 있다.
  • 관련된 행에 대한 잠금(LOCKING)이 풀리고, 다른 사용자들이 행을 조작할 수 있게 된다.

   

 ROLLBACK 

테이블 내 입력한 데이터나, 수정한 데이터, 삭제한 데이터에 대하여 COMMIT 이전에는 변경 사항을 취소할 수 있는데 데이터베이스에서는 롤백(ROLLBACK) 기능을 사용한다.

DELETE FROM PLAYER;
4개 행 이(가) 삭제되었습니다.

ROLLBACK;
롤백 완료.

 

ROLLBACK (트랜잭션 취소) 이후의 데이터 상태는 다음과 같다.

  • 데이터에 대한 변경 사항은 취소된다. 
  • 이전 데이터는 다시 재 저장된다. 
  • 관련된 행에 대한 잠금(LOCKING)이 풀리고, 다른 사용자들이 행을 조작할 수 있게 된다.

  

 SAVEPOINT 

  • 트랜잭션에 포함된 전체 작업(스텝)을 롤백하는 것이 아니라 현시점에서 미리 지정한 SAVEPOINT(저장점)까지 트랜잭션의 일부만 롤백할 수 있다.
  • 복수의 저장점을 정의할 수 있으며, 동일 이름으로 저장점을 정의했을 때는 나중에 정의한 저장점이 유효하다.
SAVEPOINT SVPT1; // 트랜잭션 내에서 SVPT1이라는 저장점 정의 
Savepoint이(가) 생성되었습니다.

DELETE FROM TEAM_TEMP;
15개 행 이(가) 삭제되었습니다.

ROLLBACK TO SVPT1; // 저장점 SVPT1 까지 롤백 
롤백 완료.

만약, 트랜잭션 시작 → UPDATE → SAVEPOINT A → DELETE → SAVEPOINT B → UPDATE 상태에서

  • ROLLBACK TO A; 를 실행할 경우, 저장점 A 이후에 정의한 저장점 B는 존재하지 않게 된다.
  • ROLLBACK; 저장점 지정 없이 롤백을 실행할 경우, 모든 변경 사항을 취소하고 트랜잭션 시작 위치로 되돌아간다. 

 

 COMMIT & ROLLBACK 

  • 트랜잭션은 트랜잭션의 대상이 되는 SQL문을 실행하면 자동으로 시작되고, COMMIT 또는 ROLLBACK을 실행한 시점에서 종료된다.
  • COMMIT과 ROLLBACK을 사용함으로써 다음과 같은 효과를 볼 수 있다.
    • 데이터 무결성 보장
    • 영구적인 변경을 하기 전에 데이터의 변경 사항 확인 가능 
    • 논리적으로 연관된 작업을 그룹핑하여 처리 가능
  • COMMIT이나 ROLLBACK 이전 데이터 상태는 다음과 같다.
    • 현재 사용자는 SELECT 문장으로 결과를 확인 가능하다.
    • 다른 사용자는 현재 사용자가 수행한 명령의 결과를 볼 수 없다.
    • 변경된 행은 잠금(LOCKING)이 설정되어 다른 사용자가 변경할 수 없다.

 

 SQL Server 3가지 COMMIT 방식 

  • AUTO COMMIT
    • Oracle은 DML을 실행하는 경우 DBMS가 트랜잭션을 내부적으로 실행하며 DML 문장 수행 후 사용자가 임의로 COMMIT 혹은 ROLLBACK을 수행해 주어야 트랜잭션이 종료된다. (일부 툴에서는 AUTO COMMIT을 옵션으로 선택할 수 있다)
    • SQL Server는 기본적으로 AUTO COMMIT 모드이기 때문에 DML, DDL 단위 SQL을 수행할 때마다 DBMS가 트랜잭션을 컨트롤하는 방식이다. 따라서 사용자가 COMMIT이나 ROLLBACK을 처리할 필요가 없다. 명령어가 성공적으로 수행되면 자동으로 COMMIT이 되고 오류가 발생할 경우 자동으로 ROLLBACK 처리된다.
  • 암시적 트랜잭션
    • Oracle과 같은 방식으로 처리된다. , 트랜잭션의 시작은 DBMS가 처리하고 트랜 잭션의 끝은 사용자가 명시적으로 COMMIT 또는 ROLLBACK으로 처리한다..
  • 명시적 트랜잭션
    • 트랜잭션의 시작과 끝을 모두 사용자가 명시적으로 지정하는 방식이다. BEGIN TRANSACTION으로 트랜잭션을 시작하고 COMMIT TRANSACTION 또는 ROLLBACK TRANSACTION으로 트랜잭션을 종료한다..
반응형