관리 메뉴

fatalite

TRANSACTION with Oracle SQL 본문

컴퓨터 공학/Database 데이터베이스

TRANSACTION with Oracle SQL

fataliteforu 2022. 12. 13. 13:12

트랜잭션

트랜잭션이란, 데이터베이스에 요청되는 질의들의 논리적 단위이다.

트랜잭션은 다음 4가지 특성(ACID)을 가지고 있어야한다.

  • Atomic : ALL or Nothing, 트랜잭션이 절반만 이뤄지는 경우가 없어야한다는 것이다. 즉, 더이상 나누어질 수 없는 단위를 의미한다.
  • Consistency : 트랜잭션이 일어나기 전과 후는 또 다른 일관된 상태를 가지고 있다. 여기서 일관된 상태란, 데이터베이스의 무결함을 유지한다는 뜻이다.
  • Isolation : 고립되어있다. 즉, 트랜잭션은 서로의 존재를 모른다고 가정한다.
  • Durability : 지속된다. 트랜잭션이 한 번 완료된다면, 번복되지 않는다. DBMS는 이를 회복 모듈로 달성하게 된다.

 

COMMIT은 모든 트랜잭션이 끝났다는 뜻이다.

ROLLBACK은 트랜잭션이 성공적이지 않았으며, ACID를 유지하기 위해서 방금 트랜잭션 연산을 철회한다는 뜻이다.

 

트랜잭션이 성공하지 못하는 경우는, 시스템 이나 디바이스, 네트워크, 재해에 의한 고장이 있을 수 있다.

 

오라클에서의 트랜잭션 명령어

COMMIT WORK
ROLLBACK WORK

동시성 제어

DBMS는 여러 클라이언트의 요청에 반응하기 위해서 트랜잭션을 병렬적으로 처리하던가, 그 정도의 기능을 해내야한다.

하나의 트랜잭션만 실행되는 것은 비직렬 스케쥴이라고 하며, 병렬적으로 이뤄지는 것은 직렬 스케쥴이라고 한다.

비직렬 스케줄이면서 직렬 스케쥴과 결과가 같을 경우, 직렬 가능 스케쥴이라고 명명한다.

 

만약 다수의 트랜잭션을 동시성 제어 없이 실행한다면

  • 오손데이터 읽기, 트랜잭션이 갱신한 값이 있으나, 철회되지 않을 경우.
  • 갱신 손실 , 한 트랜잭션의 변경 내용을 다른 트랜잭션이 덮어씀.
  • 반복할 수 없는 읽기, 한 트랜잭션이 서로 다른 값을 읽을 때를 의미한다.
    예를 들어 같은 기능의 트랜잭션 T1, T2가 있다고 가정하자.
    비행기에 좌석이 하나가 있다고 가정한다.
    만약 T1이 비행기에 좌석이 하나 이상있는지 질문하고,
    그 다음으로 T2가 비행기의 좌석이 하나 이상 있는지 질문하면,
    모두 TRUE가 나오게 될 것이다.
    그러나 이어서 T1이 좌석을 예약했다고 하면,
    T2는 좌석이 배정되지 않아야하는데, T1과 똑같은 좌석이 배정되게 된다. 

이를 위해 동시성 모듈은 로킹을 제공한다.

로킹이란, 데이터를 사용할 때 열쇠를 거는 것을 의미한다.
읽기에는 Shared Lock, 쓰기 때는 Exclusive lock을 걸게된다.

하지만 로킹을 했다고해서 동시성 제어문제가 확실이 제어되지는 않는다.

그래서 2단계 로킹 프로토콜을 사용하는데, 데이터 항목이 두 개 이상될 때 이런 현상이 발생할 수 있다.

그래서 로크 포인트라고 하는, 락 되어야하는 데이터가 모두 Lock이 된 지점까지는 Lock만이 가능하고,

로크 포인트가 지나고 나서는 Unlock만 가능하게 된다.

이런 로킹 기법의 효율성을 위해서 다중 레벨 로킹 기법을 사용하게 된다.

즉, 릴레이션, 레코드, 블록 등의 단위로 Locking이 가능하다는 뜻이다.

로킹의 단위가 작아질 수록 동시성은 증가하게되나, 오버헤드가 일어나게 된다.

 

이런 동시성 모듈은 어찌되었든, 완벽하지 않다.

데드락이라는, 예를 들어 T1, T2가 둘 다 A,B를 원하고 있는데 T1이 A를 T2가 B를 지니고 있다면,

이 상태에서는 계속해서 대기를 하게 된다는 의미이다.

또한 팬텀 문제라는 한 트랜잭션이 같은 레코드를 읽었는데, 데이터의 값이 다른 현상이 일어날 수 있다.

 

회복

DBMS는 회복 기능을 위해서 백업, 로깅, 체크 포인트를 수행한다.

로깅

로깅이란, 트랜잭션의 명령들을 어디까지 수행했는지 적어두는 것이다. 

따라서 트랜잭션이 Commit을 하기 전에 서버가 다운 되었다면, 로그에 적힌 내용을 역방향으로 하여 롤백시킨다.

이건 다른 이야기인데, 로깅의 경우 로그 버퍼, 데이터베이스 버퍼에서 로그 버퍼가 먼저 디스크에 입력되어야한다.이를 로그 먼저 쓰기(Write Ahead Logging)이라고 하는데, 만약 데이터베이스 수정 사항이 먼저 디스크의 입력된 상태에서 서버가 다운된다면, 이를 철회할 로그가 없어지기 때문이다.

 

체크 포인트

체크 포인트는, 로그와 데이터 베이스의 상태가 일치되게끔 하는 것이다. 

 

ORACLE에서의 트랜잭션 관리

COMMIT
ROLLBACK 

SAVEPOINT A
ROLLBACK TO SAVEPOINT A

SAVEPOINT는 트랜잭션의 단위를 더 잘게 한다.
하나의 데이터 조작어마다 
명시적으로 트랜잭션을 정의하고 싶다면 다음과 같이 한다..
SET AUTO ON;
SET AUTOCOMMIT ON;
트랜잭션의 디폴트는 읽기와 쓰기를 모두 수행하는 것이다.
따라서 SET TRANSACTION [READ or WRITE];
이렇게 트랜잭션의 동시성 제어를 위한 속성을 제어할 수 있다.

SQL2에서는 고립수준을 설정할 수 있다.

SET TRANSACTION READ WRITE
ISOLATION LEVEL SERIALIZABLE;

디폴트 고립 수준으로, 오손 데이터, 팬텀 문제 등이 발생하지 않는다.

그 외에도 ISOLATION LEVEL에는
REPEATABLE READ;
READ COMMITTED
READ UNCOMMITTED
의 순서이며, 아래로 갈수록 동시성은 높아지지만 데이터에 오류가 있을 수 있다.