[Oracle] 트랜잭션 (Transaction)

트랜잭션

트랜잭션이란? 업무 실행단위, 논리 명령단위, 동작 단위 등으로 설명된다.

이때, 트랜잭션의 특징은 ATOMIC 하다는 것이다.

트랜잭션은 원자성을 가져 한 트랜잭션이 실행될 때, 해당 트랜잭션은 중단되지 않는다.

가장 많이 사용되는 예시로 계좌이체 가 있다.

  • 업무적인 단위: 계좌이체
  • 물리적인 명령어 단위:
    • 송금 계좌 SELECT (돈이 있는지 확인)
    • 수신 계좌 UPDATE (송금할 만큼 계좌 정보 수정)
    • 수신 계좌 UPDATE (수금한 만큼 계좌 정보 수정)

해당 작업의 특징은 또 무엇이 있을까?

모든 작업이 명령어 단위가 만족되지 않으면, 애초에 아무것도 없던 초기 상태로 다시 돌려야 한다는 점이다.

즉, DO OR NOT 이다. 중간 상태는 없다. 송금 계좌만 바뀌고 수신 계좌는 바뀌지 않는 경우는 없다.

LOCK

그러면 이런 업무적인 단위를 어떻게 묶을 수 있을까?

스레드를 공부했으면 많이 들어봤겠지… 락(LOCK)…

ORACLE 에서 사용하는 LOCKCOMMIT / ROLLBACK 이라 생각하면 된다고 한다.

PDB를 만들 때, 임시 파일을 지정해줬었다.

우리가 작업하는 내용은 임시 파일에 쓰이고 있다가 COMMIT; 명령어가 사용되면 이 작업이 모두 파일에 등록된다.

그렇게 되면 다른 계정으로 같은 데이터베이스에 접속해도 같은 내용을 볼 수 있다.

이때, 한 개의 계정에서 UPDATE 를 하면 다른 계정에서는 UPDATE 가 불가능하다. 작업을 기다리고 있다.

LOCK이 걸려있는 상태다. 그래서 이걸 풀어주려면 COMMIT 이나 ROLLBACK 을 해줘야 한다. 그래서 여러 사람들이 같은 데이터베이스에 접속해 수정 작업을 하면 가끔 락이 걸리는 경우가 생긴다.

Updated:

Leave a comment