DevCourse/SQL & Data Analytics

Transaction

Younder 2024. 4. 26. 17:35

Transaction ? 

Atomic하게 실행되어야 하는 SQL 들을 묶어서 하나의 작업처럼 처리하는 방법, 즉 여러개의 쿼리가 동시에 실행되었을 때 데이터의 정합성이 문제가 되지 않는 경우를 Atomic 하다라고 한다.

  • DDL / DML 중 레코드를 수정/추가/삭제한 것에만 의미가 있음.
  • SELECT 에는 transaction을 사용할 이유가 없음
  • BEGIN 과 END 혹은, BEGIN 과 COMMIT 사이에  해당 SQL 들을 사용하는 것을 Transaction 을 이용하는 방법.
  • ROLLBACK

Transactio의 4대 특성 ( ACID )

  1. Atomicity(원자성) : Transaction 내의 모든 연산들은 모두 실행되거나, 모두 실행되지 않아야 한다는 특성을 말한다. 즉 transaction은 하나의 단위로 처리되어야 함을 말한다.
  2. Consistency(일관성) : Transaction 이 성공적으로 완료되면, 데이터 베이스는 하나의 유효한 상태에서 다른 유효한 상태로 변화해야 한다. 이는 데이터 베이스의 무결성 제약 조건을 항상 충족되어야 함을 의미한다.
  3. Isolation(독립성) : 동시에 여러 transaction 이 실행되고 있을 때 각 transaction은 서로 독립적으로 실행되는 것 처럼 보여야 한다. 즉 하나의 transaction의 중간 결과는 다른 transaction에서 확인할 수 없다.
  4. Dyrability(지속성) : Transaction이 성공적으로 완료되면, 그 결과는 영구적으로 데이터 베이스에 반영되어야 한다. 시스템이 문제가 되더라도 완료된 transaction의 결과는 손실 되어선 안된다. 

 transaction 의 사용 예시.

계좌이체는 인출과 입금 두 과정으로 이뤄진다. 

만약에 인출에 성공했는데, 입금에 실패 한다면 ?? 

-> 이 두 과정은 동시에 성공하던지, 실패하던지 동시에 일어나야한다 즉 Atomic 하게 일어나야 한다. 

이런 과정들은 transaction 으로 묶어주어야 한다. 

만약 조회만 한다면 Transaction 으로 묶일 이유가 없다. 

 

추가로 생각을 해보면 온라인 쇼핑몰의 주문의 경우에도 상품 주문 > 결제 > 재고 감소 > .. 등의 과정들이 모두 성공해야만 하며 중간에 하나라도 실패한다면 ROLLBACK 되어야 한다.

 

Transaction 의 관리 기법

  • Locking : 데이터에 대한 동시 접근을 제어하여 데이터의 일관성과 독립성을 보장할 수 있다.
  • Multi-Version Concurrency Control (MVCC) : 여러 버전의 데이터를 유지하여 동시성을 향상시키는 기법으로 이를 사용하여 읽기 작업이 쓰기 작업에 의해 차단되지 않고, 반대의 경우도 마찬가지로 실행될 수 있다.
  • Log-Based Recovery : Transaction의 실행 중에 로그를 기록함으로써, 시스템 장애 발생 시에도 데이터의 일관성을 유지할 수 있다.

즉, Transaction은 데이터의 일관성과 신뢰성을 유지하는데 매우 중요한 역할을 한다.

 

 

BEGIN - END 문법을 이용한 예시.

 

다음과 같은 형태로 사용할 수 있다. 그림처럼 BEGIN 과 END 사이에 들어간 쿼리문은 하나의 쿼리처럼 처리되어 성공하면 모두 성공하고,실패하면 모두 실패한다.

 

END 와 COMMIT 은 동일하고, 실행 후 이전의 상태로 돌아가고 싶다면 "ROLLBACK" 을 명령어를 실행하면 이전 상태로 돌아갈 수 있다.

단, 이 동작은 COMMIT MODE 에 따라서 달라진다.

 

 

Transaction Commit Mode : autocommit

  • Autocommit = True 
    • 모든 레코드 수정/삭제/추가 작업이 기본적으로 바로 데이터 베이스에 쓰여지고, 이를 커밋 된다고 한다.
    • 만약 어떤 특정한 작업들을 트랜잭션으로 묶고 싶다면 BEGIN 과 END(COMMIT) / ROLLBACK 으로 처리
    • 트랜잭션으로 실행하면 트랜잭션으로 묶은 작업이 성공된다면 그 때 데이터 베이스에 쓰여진다. 
    • 커밋으로 쓰여져야지만 다른 사용자가 봤을 때 변경사항이 적용되어 있다. 
  • Autocommit = False
    • 모든 레코드 수정/삭제/추가 작업이 commit 호출될 때 까지 커밋되지 않는다.

 

 

DELETE FROM vs TRUNCATE

 

  • DELETE FROM <table> ( not DELETE * FROM )
    • 테이블에서 모든 레코드를 삭제한다. ( 단 테이블은 남아 있음 ! )
    • DROP TABLE <table> 과는 다른 명령어이다 ! ( 테이블 자체를 삭제하기 때문에 ) 
    • WHERE 절을 이용해 조건에 맞는 레코드만 삭제가 가능하다.
  • TRUNCATE <table> 
    • 테이블에서 모든 레코드를 삭제하는 것. 
  • 둘의 차이점은 DELETE FROM 은 transaction 에서 사용할 수 있고 ROLLBACK 도 가능하다 
    하지만, TRUNCATE transaction 에서 사용 할 수 있지만, ROLLBACK 이 안된다는 점에서 차이점이 있다.
  • TRUNCATE 는 시간을 빠르게 테이블의 모든 레코드를 삭제시킬 때 사용하기 적합한 삭제 명령어라고 볼 수 있다.

'DevCourse > SQL & Data Analytics' 카테고리의 다른 글

JOIN  (1) 2024.04.25
GROUP BY 와 AGGREGATE 그리고 CTAS  (1) 2024.04.24